» »

[C++] Kocka (naloga iz tekmovanja)

[C++] Kocka (naloga iz tekmovanja)

Slovenia13 ::

Napiši program ki bo prebral začetno postavitev kocke. števila na stranicah bodo od 1 - 6. Prva vrstica vhoda ima obliko "[zgoraj][spodaj][levo][desno][spredaj][zadaj]" (npr: "6 1 3 4 2 5" (zgornja ploskev = 6; spodna = 1; leva = 3; desna = 4;...))
V spodnji vrstici pa bo sledil niz potez. Vsaka poteza bo predstavljena z eno od črk F(kocka se prevali na sprednjo ploskev),B(na zadnjo ploskev),L(na levo),R(na desno). Da so nizi krajši so nekatere enake zaporedne poteze zapisane s črko(F,B,L,R) tej črki pa sledi število prevračanj v tej smeri (npr: FB3 pomeni 1xna sprednjo in 3xna zadnjo ploskev).
Izpiši končno postavitev kocke na enak način kot je bila postavitev prebrana.

No men je uspel, da se kocka lepo obrača v željeno smer. ne rata pa mi kko narest d bo program pogledu če je po določeni potezi število in tolikokrat izvedel tisto potezo. žal ne morem prilepiti kode ker nisem doma.

Tutankhamun ::

kaj pa to poemni, da se 3x zakotali po zadnji stranici, pa 1x po sprednji? Kako se pa to kotali? 3x skoči po zadnji stranici?
AMD Phenom QUAD 9950 Black Edition, 8GB

drola ::

3x skoči na zadnjo stranico?
https://drola.si

Ktj ::

Am, FB3 == B2? Drugače pa ne zastopim kaj muči avtorja te teme?

Tutankhamun ::

Ajaaaa premiki so naprej levo pa desno. Se pravi 1x naprej pa 3x nazaj. To nism kuj zastopu.

A zdej te pa zanima katera cifra je spodi pa zgori pa levo pa desno po premiku?
AMD Phenom QUAD 9950 Black Edition, 8GB

Tutankhamun ::

Js bi tko reku, sm se mal igrov s kocko. :)

Če te zanima katera številka je na vrhu kocke pa spodi.... po metu, bi js tko na naredu.

Če maš kotaljenje definirano takole: 9x naprej, 2x levo, 1x nazaj, 3x desno
Sploh ni važn v kakšnem vrstnem redu greš. Lahk jih prememšaš med sabo. Uglavnem to lahko potem mal poenostavš v:
9x naprej + 1x nazaj = 8x naprej oz. 0x naprej (8 % 4 = 0; 0x - ni kotaljenja)
2x levo + 3x desno = 1x desno

Pol pa res ni več problem ugotovit kako je kocka postavljena, ker imaš samo dve smeri, pa še te se zakotalijo za največ 3x.

Pol pa imaš recimo kocko: 6 je spodi, 1 zgori, 2 na desni, 5 na levi, 3 spredaj in 4 zadaj
  1 
  3
2 6 5
  4

Pol pa lahko vrtiš naprej 6314 6314 ... al pa nazaj 6413 6413
al pa levo 6215 6215 ... al pa desno 5126 5126
Tko na hitrco.
AMD Phenom QUAD 9950 Black Edition, 8GB

Zgodovina sprememb…

Tutankhamun ::

Mal drgač sm hotu napisat.
Predpostavmo da je na začetku številka 6 na dnu, 2 na levi in 3 na spredni strani klocke.
Premikanje naprej 3x
  1       4       6       3
  3       1       4       6
2 6 5   2 3 5   2 1 5   2 4 5
  4       6       3       1

Premikanje desno 3x
  1       2       6       5
  3       3       3       3
2 6 5   6 5 1   5 1 2   1 2 6
  4       4       4       4

Tko nekak bi js naredu.
AMD Phenom QUAD 9950 Black Edition, 8GB

Slovenia13 ::

ubistvo men ne rata d program prebere število po ukazu (npr: F14 mi prebere sam F, 14 pa ne dubim)

Ktj ::

če mu podaš parameter kot: program.exe 123456 F14 L22...

int poteze;
char obrat;
for(int i = 2; i < argc;i++)
{
obrat = argv[i][0];
poteze = atoi(argv[i][1]);
// naredi premike oz karkoli
}

Mogoče je kakšna napaka ker pišem iz glave.

Tutankhamun ::

Če maš še problem, dej kar maš kode za branje sm prlep, da ti kdo poprav.
AMD Phenom QUAD 9950 Black Edition, 8GB

Zgodovina sprememb…

Tutankhamun ::

Evo neki sm spacov skp za branje metov!
Pa ne pozabt includat "sstream"

stringstream ssThrow;

ssThrow << "FB2LR15F1";

char move;
int count;

while (!ssThrow.eof ())
{
	count = 1;
	ssThrow >> move;
	ssThrow >> count;

	cout << move << count << endl;

	if (ssThrow.rdstate() & ios::failbit)
		ssThrow.clear ();

}
AMD Phenom QUAD 9950 Black Edition, 8GB

Zgodovina sprememb…

Slovenia13 ::

Hvala to mi dela sam za tvoj primer ko pa upišem niz ukazou "LFF12RRRL" mi pa piše:
L1
L1
L1
L1
...

Zakaj?

Zgodovina sprememb…

Tutankhamun ::

Sm prehit delu, pa sm si izbral slab primer. Pa tut s tem ne delam tok velik, tko da napake so lahk prisotne ;). Evo zdej sm pa clo prebral kako tist clear deluje, prej nism :P. Evo popravljeno.

	stringstream ssThrow;

	ssThrow << "LFF12RRRL";

	char move;
	int count;

	do
	{
		ssThrow.clear ();
		count = 1;
		ssThrow >> move;
		ssThrow >> count;

		cout << move << count << endl;

	} while (!ssThrow.eof ());


Pa while lahk tut postavš gor če hočeš, da bo tko kot prej.
AMD Phenom QUAD 9950 Black Edition, 8GB

Zgodovina sprememb…

Slovenia13 ::

Zdj sm mal sprobavu pa popravu uno t staro kodo pa dubu sam mi ne dela izpiše kar jst vpišem (pozicija kocke)
#include <iostream>
#include <string>
#include <sstream>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::stringstream;

int main (int argc, char* argv[]) {

	int iPonovi;
	char cUkaz;
	char cKocka[7];
	string sVhod;
	stringstream ssNiz;
	
	for (int i = 1; i < 7; i++) {
		cin >> cKocka[i];
	}
	
	cin >> sVhod;
	ssNiz << sVhod;
	
	while (!ssNiz.eof()) {
		ssNiz.clear();
		iPonovi = 1;
		ssNiz >> cUkaz;
		ssNiz >> iPonovi;
		
		for (int i = 0; i < iPonovi; i++) {	
		switch(cUkaz) {
			case 'F' :
				cKocka[0] = cKocka[1];
				cKocka[1] = cKocka[6];
				cKocka[6] = cKocka[2];
				cKocka[2] = cKocka[5];
				cKocka[5] = cKocka[0];
			case 'B' :
				cKocka[0] = cKocka[1];
				cKocka[1] = cKocka[5];
				cKocka[5] = cKocka[2];
				cKocka[2] = cKocka[6];
				cKocka[6] = cKocka[0];
			case 'L' :
				cKocka[0] = cKocka[1];
				cKocka[1] = cKocka[4];
				cKocka[4] = cKocka[2];
				cKocka[2] = cKocka[3];
				cKocka[3] = cKocka[0];
			case 'R' :
				cKocka[0] = cKocka[1];
				cKocka[1] = cKocka[3];
				cKocka[3] = cKocka[2];
				cKocka[2] = cKocka[4];
				cKocka[4] = cKocka[0];
		}
            }
	}
	
	for (int i = 1; i < 6; i++) {
		cout << cKocka[i] << endl;
	}
	cout << cKocka[6];

	
	while(true);
}

Zgodovina sprememb…

Tutankhamun ::

No sam tok, da veš sm prej pozabu napisat. Prej ni delal zato ker se je tvoja sekvenca končala brez številke na konc ;)
AMD Phenom QUAD 9950 Black Edition, 8GB

Slovenia13 ::

a mogoče kdo ve kaj je narobe z uno mojo kodo??

Tutankhamun ::

komot ti povem. Samo primer:
Poglej prvo pa zadnjo vrstico kode, v mojem postu

cKocka[0] = cKocka[1];
cKocka[1] = cKocka[6];
cKocka[6] = cKocka[2];
cKocka[2] = cKocka[5];
cKocka[5] = cKocka[0];


Najprej na pozicijo 0 shranš vrednost, ki je bila na poziciji 1. Pol pa to isto vrednost v zadnji vrstici kopiraš na pozicijo vrednost 5. Samo primer, tega maš velik.

Evo neki sm na hit naredu, premika se pa tko sam naprej pa levo. Če se hočeš premaknt za eno v desno, je to isto kot če bi se premaknu 3x v levo. "levo = 4 - desno". Enako je za naprej nazaj!!!
	int bottom, top, left, right, front, back;

	int *move_forward [] = {&bottom, &front, &top, &back, &bottom, &front, &top};
	int *move_left [] = {&bottom, &left, &top, &right, &bottom, &left, &top};

	bottom = 6;
	left = 2;
	right = 5;
	front = 3;
	back = 4;
	top = 1;

	// display
	cout << "  " << top << endl;
	cout << "  " << front << endl;
	cout << left << " " << bottom << " " << right << endl;
	cout << "  " << back << endl << endl;

	int temp [4];

	int throw_forward = 3;
	int throw_left = 3;

	// throw forward
	for (int i = 0; i < 4; i++)
		temp [i] = *move_forward [throw_forward + i];

	for (int i = 0; i < 4; i++)
		*move_forward [i] = temp [i];

	// throw left
	for (int i = 0; i < 4; i++)
		temp [i] = *move_left [throw_left + i];

	for (int i = 0; i < 4; i++)
		*move_left [i] = temp [i];

	// display
	cout << "  " << top << endl;
	cout << "  " << front << endl;
	cout << left << " " << bottom << " " << right << endl;
	cout << "  " << back << endl;
AMD Phenom QUAD 9950 Black Edition, 8GB


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

c++ rabim pomoč konstuktorji

Oddelek: Programiranje
61090 (785) Snowflake2
»

matematični nalogi

Oddelek: Šola
221568 (1191) technolog
»

Naloga v C#

Oddelek: Programiranje
72608 (2108) Hardstyle
»

Rubikova Kocka

Oddelek: Loža
264389 (3664) Valentin

Več podobnih tem