#include using namespace std; int n; long long a, b, c, d, e, f, C, F; //velicine iz postavke zadatka bool tabla[30][30]; //nasa matrica, false ima ako je posmatrano polje prazno, a true ako je popunjeno nekim blokom int indeks, ugao; vector blokovi={ //struktura koja pamti sve blokove za sve rotacije // ugao 0 ugao 1 ugao 2 ugao 3 /*blok0*/ 0,0,0,-1,-1,0,-1,-1, 0,0,-1,0,0,1,-1,1, 0,0,0,1,1,0,1,1, 0,0,0,-1,1,0,1,-1, /*blok1*/ 0,0,0,-1,-1,0,0,0, 0,0,-1,0,0,1,0,0, 0,0,0,1,1,0,0,0, 0,0,1,0,0,-1,0,0, /*blok2*/ 0,0,0,-1,0,-2,-1,0, 0,0,-1,0,-2,0,0,1, 0,0,0,1,0,2,1,0, 0,0,1,0,2,0,0,-1, /*blok3*/ 0,0,0,-1,0,-2,0,-3, 0,0,-1,0,-2,0,-3,0, 0,0,0,1,0,2,0,3, 0,0,1,0,2,0,3,0, /*blok4*/ 0,0,-1,0,-2,0,-1,-1, 0,0,0,1,0,2,-1,1, 0,0,1,0,2,0,1,1, 0,0,0,-1,0,-2,1,-1, }; int trenutni_blok[8]; vector resenje1, resenje2, resenje3, resenje4, resenje5; //resenja za sva 4 smera pretrage + sprilnu pretragu vector iksevi, ipsiloni; //u svakoj iteraciji glavne petlje azuriramo podatke po formulama iz postavke void azuriraj_podatke(){ c=(c^a)+b; f=(f^d)+e; indeks=c%5; ugao=f%4; } //ispisujemo matricu void ispisi_matricu(){ for(int r=0; r<=n+1; r++){ for(int c=0; c<=n+1; c++) cout<=1; r--){ for(int c=1; c<=n; c++){ int brojac=0; for(int k=0; k<8; k+=2){ if(tabla[r+trenutni_blok[k]][c+trenutni_blok[k+1]]) break; else brojac++; } if(brojac==4){ for(int k=0; k<8; k+=2) tabla[r+trenutni_blok[k]][c+trenutni_blok[k+1]]=true; resenje2.push_back(r); resenje2.push_back(c); return true; } } } return false; } bool pretrazi_tablu_iz_goredesno(){ for(int r=1; r<=n; r++){ for(int c=n; c>=1; c--){ int brojac=0; for(int k=0; k<8; k+=2){ if(tabla[r+trenutni_blok[k]][c+trenutni_blok[k+1]]) break; else brojac++; } if(brojac==4){ for(int k=0; k<8; k+=2) tabla[r+trenutni_blok[k]][c+trenutni_blok[k+1]]=true; resenje3.push_back(r); resenje3.push_back(c); return true; } } } return false; } bool pretrazi_tablu_iz_doledesno(){ for(int r=n; r>=1; r--){ for(int c=n; c>=1; c--){ int brojac=0; for(int k=0; k<8; k+=2){ if(tabla[r+trenutni_blok[k]][c+trenutni_blok[k+1]]) break; else brojac++; } if(brojac==4){ for(int k=0; k<8; k+=2) tabla[r+trenutni_blok[k]][c+trenutni_blok[k+1]]=true; resenje4.push_back(r); resenje4.push_back(c); return true; } } } return false; } //spiralna pretraga void formiraj_spiralne_nizove(){ int top = 1, bottom = n, left = 1, right = n; int x = 0, y = 0; while (top <= bottom && left <= right) { for (y = left; y <= right; ++y) { iksevi.push_back(top); ipsiloni.push_back(y); } ++top; for (x = top; x <= bottom; ++x) { iksevi.push_back(x); ipsiloni.push_back(right); } --right; if (top <= bottom) { for (y = right; y >= left; --y) { iksevi.push_back(bottom); ipsiloni.push_back(y); } --bottom; } if (left <= right) { for (x = bottom; x >= top; --x) { iksevi.push_back(x); ipsiloni.push_back(left); } ++left; } } } bool pretrazi_tablu_spiralno(){ formiraj_spiralne_nizove(); int r, c, brojac; for(int i=0; i>n>>a>>b>>C>>d>>e>>F; //vrsimo pretragu u sva 4 moguca smera popuni_tablu(); while(true){ azuriraj_podatke(); odredi_blok(); if(pretrazi_tablu_iz_gorelevo()) ocisti_ako_moze(); else break; } popuni_tablu(); while(true){ azuriraj_podatke(); odredi_blok(); if(pretrazi_tablu_iz_dolelevo()) ocisti_ako_moze(); else break; } popuni_tablu(); while(true){ azuriraj_podatke(); odredi_blok(); if(pretrazi_tablu_iz_doledesno()) ocisti_ako_moze(); else break; } popuni_tablu(); while(true){ azuriraj_podatke(); odredi_blok(); if(pretrazi_tablu_iz_goredesno()) ocisti_ako_moze(); else break; } popuni_tablu(); while(true){ azuriraj_podatke(); odredi_blok(); if(pretrazi_tablu_spiralno()) ocisti_ako_moze(); else break; } //izlaz freopen("block.out","w",stdout); ispis(); return 0; }