» »

C++ spiralno pisanje v array

ghost ::

Imaš dvodimenzionalno polce celih stevil [21][21]. V to polje spiralno vstavljas števila. In sicer začneš v polju tabela[10][10] z vrednostjo 1. Nato bos v vsako naslednje polje vstavil vrednost prejsnjega polja in prištel naključno vrednost med 1 in 3. Naslednje polje pa bos spiralno krozil v obratni smeri urinega kazalca. Zadevo nama je s sošolcem skoraj ze uspelo rešiti, vendar se zalomi pri vpisovanju ( zakompliciralo se je zaradi uporabe if ) Ima mogoce kdo kaksno bol konkretno idejo kako zadevo resiti ( if sva uporabljala po spremembi smeri ).

Hexx ::

Naslednje polje pa bos spiralno krozil v obratni smeri urinega kazalca.

kako to misliš?
Alfa Romeo - making drivers into mechanics since 1910

kogledom ::

Ker c++ ne poznam sem napisal v c#. Upam da ti kaj pomaga, če ne drugega vsaj logika premikanja.

namespace SpiralArray
{
    class Program
    {
        static void Main(string[] args)
        {
            int[,] arr = new int[21,21];
            arr[10, 10] = 1;
            int value;
            int[] tmp = new int[] {10, 10};
            System.Random r = new System.Random();
            do
            {
                value = arr[tmp[0], tmp[1]];
                tmp = NextPosition(tmp[0], tmp[1]);
                arr[tmp[0], tmp[1]] = value + r.Next(1, 3);
            } while (!(tmp[0] == 0 && tmp[1] == 20));
        }

        static int[] NextPosition(int x, int y)
        {
            //začetna pozicija, predvidevam da gre gor.
            if (x == 10 && y == 10) return new int[] {--x, y};

            //preveri če si v enem izmed kotov spirale
            if (x == y) //levo zgoraj ali desno spodaj?
                return x < 10 ? new int[] {++x, y} : new int[] {--x, y};
            if (x + y == 20)
                return x < 10 ? new int[] {--x, y} : new int[] {x, ++y};

            //preveri če je x ali y 10
            if (x == 10)
                return x < y ? new int[] {--x, y} : new int[] {++x, y};
            if (y == 10)
                return x < y ? new int[] {x, --y} : new int[] {x, ++y};

            // preostalo premikanje
            if (x < 10 && y < 10)
                return x < y ? new int[] {x, --y} : new int[] {++x, y};
            if (x < 10 && y > 10)
                return x + y > 20 ? new int[] {--x, y} : new int[] {x, --y};
            if (x > 10 && y < 10)
                return x + y > 20 ? new int[] {x, ++y} : new int[] {++x, y};
            return x < y ? new int[] {--x, y} : new int[] {x, ++y};
        }
    }
}

ghost ::

Se opravicujem ker nism dodal slikice ( ne se smejat ni neki mojstrovina )

Zgodovina sprememb…

  • spremenil: ghost ()

Senitel ::

Narediš začetni korak, greš deno 1, greš gor 1, greš levo 2, greš dol 2, greš desno 3, greš gor 3, greš levo 4, greš dol 4,...

imagodei ::

Jaz bi imel eno spremenljivko za smer gibanja in potem bi gledal, ali je leva, desna oz. spodnja, zgornja celica frej. IOW, če je smer gibanja navzgor, potem gledam, ali je frej leva celica. Če ni, vpišem novo vrednost v eno celico višje in prestavim izhodišče. Takoj ko je frej leva, spremenim smer gibanja v levo in tudi zapišem vrednost v levo celico. Potem gledam, če je frej spodnja celica - dokler ni, vpisujem v naslednjo levo in prestavljam izhodišče. Takoj ko je, spremenim smer gibanja navzdol in tudi vpišem vrednost v naslednjo celico navzdol, prestavim izhodišče. Potem opazujem, ali je frej moja desna celica...

To je to, pa še preverjat je treba, da nisi out of bounds.
- Hoc est qui sumus -

Tutankhamun ::

const int WIDTH = 21;
const int HEIGHT = 21;
const int RPT = 2;

typedef unsigned int UINT;
typedef UINT field_t [HEIGHT][WIDTH];
typedef struct
{
	UINT w;
	UINT h;
} loc_t;
typedef enum {UP, DOWN, LEFT, RIGHT} turn_t;

void Display (field_t field)
{
	for (int h = 0; h < HEIGHT; h++) {
		cout << '|';
		for (int w = 0; w < WIDTH; w++) {
			cout.width(2);
			cout << field[h][w] << '|';
		}
		cout << endl;
	}
	cout << endl;
}

int main(int argc, char* argv[])
{
	field_t field = {0};
	loc_t loc = {10, 9};
	turn_t turn = DOWN;
	UINT nn = 1;

	UINT STP = 2;
	UINT stp = STP;
	UINT rpt = RPT;

	for (int i = 0; i < (WIDTH*HEIGHT); i++) {
		switch(turn) {
		case DOWN:
			field[++loc.h][loc.w] = nn;
			break;
		case UP:
			field[--loc.h][loc.w] = nn;
			break;
		case LEFT:
			field[loc.h][--loc.w] = nn;
			break;
		case RIGHT:
			field[loc.h][++loc.w] = nn;
			break;
		}

		Display(field);

		--stp;
		if (stp == 0) {
			--rpt;
			if (rpt == 0) {
				++STP;
				++nn;
				rpt = RPT;
			}
			stp = STP-1;
			if (turn == DOWN) turn = RIGHT;
			else if (turn == RIGHT) turn = UP;
			else if (turn == UP) turn = LEFT;
			else if (turn == LEFT) turn = DOWN;
		}

	}

	return 0;
}

AMD Phenom QUAD 9950 Black Edition, 8GB

imagodei ::

Recimo, ja :)
- Hoc est qui sumus -

ghost ::

Imam samo se eno vprasanje , logiko sva sicer imela ze prej zelo podobno vendar na daljsi nacin , kaj naj bi bili stp,STP,rpt in RPT , lepo prosim za razlago ker se mi tuki ustavi,hvala za vse dosedaj. Hvala vsem za pomoc , smo uspeli naredi tako da dela se enkrat hvala , ampak vseeno bi prosil da poves kaj naj bi stp,rpt,STP in RPT predstavlali.?

Zgodovina sprememb…

  • spremenil: ghost ()

Tutankhamun ::

sm si pač neki zmislu :D. stp pomeni koliko korakov mora še narediti, preden se spremeni smer. STP je spremenljivka, ki pove koliko korakov mora narediti do naslednje speremembe smeri. rpt pomeni koliko obratov mora še narediti, da se poveča STP za 1. RPT pa je konstanta 2, ki samo nastavi rpt ko pride na 0. 2x se smer obrne pri čemer je število korakov rpt enako.

Zdej sm opazu, da bi lahko STP dau na začetku na 1, stp pa na 2. Pa stp = STP-1; bi zamenju za stp = STP. Nism sprobu :P.
AMD Phenom QUAD 9950 Black Edition, 8GB

ghost ::

Hvala za pomoc, ubistvu je bla tud najina logika dobra , sam mal preobsezna xD , in smo ugotovil zakaj so tiste spremenljivke, vseeno hvala


Vredno ogleda ...

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

[Java] Kreiranje n-dimenzionalne tabele

Oddelek: Programiranje
5558 (455) Pawle
»

C++ - čudno obnašanje dinamično alociranega polja

Oddelek: Programiranje
5491 (372) Jean-Paul
»

programiranje v c++

Oddelek: Programiranje
5915 (681) Tutankhamun
»

Programiranje "Šah-a" v Javi

Oddelek: Programiranje
262271 (1787) OwcA
»

Dev-C++ in napaka pri prevajanju funkcij

Oddelek: Programiranje
18581 (430) MartnKrp

Več podobnih tem