#150
shift1
Bulbuka este foarte pasionată de gătit deserturi. Ea a decis să facă
(n+2)*(n+2)
brioşe pe care le-a numerotat (cu ciocolată, bineinţeles) în modul următor: primele n*n
brioşe au fost numerotate de la 1
la n*n
, iar restul până la (n+2)*(n+2)
au primit valoarea 0
. De asemenea, după ce au fost gata, Bulbuka nu a putut rezista tentaţiei de a ordona brioşele într-un pătrat cu latura (n+2)
după cum urmează: cele cu 0
pe conturul exterior iar cele numerotate de la 1
la n*n
, în interior, în ordine crescătoare, pe linii, de sus in jos, ca în figura alăturată. Bulbuka a numit această aranjare configuraţia ordonată a brioşelor.
Acest aranjament frumos a durat foarte puţin deoarece, pe când Bulbuka stătea cu spatele, Randomel a amestecat brioşele între ele, într-o ordine aleatoare. Când s-a întors şi a văzut fapta, ea s-a supărat foarte tare şi l-a pedepsit pe Randomel punându-l să le aranjeze la loc cum erau (ca în imagine) folosind doar un set limitat de operaţii: shiftări circulare pe linii şi pe coloane. O shiftare presupune deplasarea circulară la dreapta, pe linie sau în jos, pe coloană, cu cel puţin una şi cel mult n+1
poziţii.
Randomel vă roagă să scrieţi un program care, pentru o aranjare aleatorie a brioşelor, să afişeze shiftările circulare posibile care transformă configuraţia dată într-o configuraţie ordonată.
Urmasii lui Moisil, Iasi, 2013
Problema | shift1 | Operații I/O |
![]() shift1.in /shift1.out
|
---|---|---|---|
Limita timp | 1 secunde | Limita memorie |
Total: 64 MB
/
Stivă 8 MB
|
Id soluție | #58088680 | Utilizator | |
Fișier | shift1.cpp | Dimensiune | 4.99 KB |
Data încărcării | 13 Mai 2025, 15:17 | Scor / rezultat | Eroare de compilare |
shift1.cpp:1:1: error: expected unqualified-id before string constant "#include <cstdio>\n#include <list>\n#include <map>\n#define NMAX 1006\n\n\nusing namespace std;\n\nstruct pos_str {int x; int y;};\nstruct move_str {char which; int number; int times;};\n\nint a[NMAX][NMAX];\npos_str b[NMAX * NMAX];\n\nchar output_stream[22000000];\nint output_ind = 0;\n\nint n = 0;\n\nint moves_count = 0;\n\nmultimap<int, pos_str> zeroes;\n\n\nvoid add_zero(int i, int j)\n{\n int key = i * n + j;\n pos_str aux;\n aux.x = i;\n aux.y = j;\n zeroes.insert(make_pair(key, aux));\n}\n\n\nvoid remove_zero(int i, int j)\n{\n int key = i * n + j;\n zeroes.erase(key);\n}\n\nvoid update_zero(int from_i, int from_j, int to_i, int to_j)\n{\n remove_zero(from_i, from_j);\n add_zero(to_i, to_j);\n}\n\nvoid add_move(char which, int number, int times)\n{\n //sprintf(buff, \"%c %d %d\\n\", which, number, times);\n //moves_str += buff;\n //moves_str << which << ' ' << number << ' ' << times << endl;\n\n output_stream[output_ind++] = which;\n output_stream[output_ind++] = ' ';\n// if (number >= 100)\n {\n output_stream[output_ind++] = (number / 100) + '0';\n number %= 100;\n }\n// if (number >= 10)\n {\n output_stream[output_ind++] = (number / 10) + '0';\n number %= 10;\n }\n// if (number >= 0)\n {\n output_stream[output_ind++] = (number) + '0';\n }\n\n output_stream[output_ind++] = ' ';\n\n// if (times >= 100)\n {\n output_stream[output_ind++] = (times / 100) + '0';\n times %= 100;\n }\n// if (times >= 10)\n {\n output_stream[output_ind++] = (times / 10) + '0';\n times %= 10;\n }\n// if (times >= 0)\n {\n output_stream[output_ind++] = (times) + '0';\n }\n output_stream[output_ind++] = '\\n';\n\n moves_count ++;\n}\n\nvoid swap_two(int val, pos_str one, pos_str two)\n{\n\n if (val == 0)\n {\n update_zero(one.x, one.y, two.x, two.y);\n }\n else\n {\n b[val] = two;\n }\n a[two.x][two.y] = val;\n\n}\n\nvoid swap_values(pos_str x, pos_str y, pos_str z)\n{\n int val_x = a[x.x][x.y];\n int val_y = a[y.x][y.y];\n int val_z = a[z.x][z.y];\n\n swap_two(val_x, x, y);\n\n swap_two(val_y, y, z);\n\n swap_two(val_z, z, x);\n\n}\n\n\nvoid move_piece_from_to(int from_i, int from_j, int to_i, int to_j)\n{\n pos_str d, e, f;\n d.x = from_i;\n d.y = from_j;\n e.x = to_i;\n e.y = to_j;\n\n if (from_i == to_i)\n {\n add_move('L', to_i, n + 2 - from_j + to_j);\n add_move('C', to_j, n + 1);\n add_move('L', to_i, from_j - to_j);\n add_move('C', to_j, 1);\n\n //print_moves(); \n\n f.x = (to_i + 1) % (n + 2);\n f.y = to_j;\n\n }\n else\n if (from_j == to_j)\n {\n add_move('L', from_i, n + 1);\n add_move('C', to_j, from_i - to_i);\n add_move('L', from_i, 1);\n add_move('C', to_j, n + 2 - from_i + to_i);\n\n //print_moves(); \n\n f.x = from_i;\n f.y = (from_j + 1) % (n + 2);\n\n }\n else\n {\n add_move('C', to_j, from_i - to_i);\n add_move('L', from_i, (to_j > from_j) ? (to_j - from_j) : (n + 2 - from_j + to_j));\n add_move('C', to_j, n + 2 - from_i + to_i);\n add_move('L', from_i, (to_j < from_j) ? (from_j - to_j) : (n + 2 - to_j + from_j));\n\n //print_moves();\n\n f.x = from_i;\n f.y = to_j;\n\n }\n\n swap_values(d, e, f);\n}\n\n\nvoid move_zero_to(int i, int j)\n{\n multimap<int, pos_str>::iterator it = zeroes.begin();\n move_piece_from_to(it->second.x, it->second.y, i, j);\n}\n\nvoid za_read()\n{\n FILE *fin = fopen(\"shift1.in\", \"rb\");\n fscanf(fin, \"%d\\n\", &n);\n //setvbuf(fin, NULL, _IOFBF, 102400);\n\n\n for (int i = 0; i < n + 2; i++)\n {\n for (int j = 0; j < n + 2; j++)\n {\n int aux = 0;\n fscanf(fin, \"%d\", &aux);\n\n a[i][j] = aux;\n\n b[aux].x = i;\n b[aux].y = j;\n\n if (aux == 0)\n {\n add_zero(i, j);\n }\n }\n }\n\n fclose(fin);\n\n}\n\nvoid za_write()\n{\n FILE *fout = fopen(\"shift1.out\", \"wb\");\n output_stream[output_ind] = 0;\n fprintf(fout, \"%d\\n\", moves_count);\n fprintf(fout, \"%s\", output_stream);\n fclose(fout);\n}\n\nint main()\n{\n \n\n za_read();\n\n for (int i = 0; i < n + 2; i++)\n {\n for(int j = 0; j < n + 2; j++)\n {\n //daca e prima sau ultima linie/coloana\n if ((i==0) || (j==0) || (i==n+1) || (j==n+1))\n {\n if (a[i][j] != 0)\n {\n move_zero_to(i,j);\n }\n remove_zero(i, j);\n continue;\n }\n\n int should_be = (i - 1) * n + j;\n\n if (a[i][j] != should_be)\n {\n move_piece_from_to(b[should_be].x, b[should_be].y, i, j);\n }\n }\n }\n\n za_write();\n\n return 0;\n}" ^
www.pbinfo.ro permite evaluarea a două tipuri de probleme:
Problema shift1 face parte din prima categorie. Soluția propusă de tine va fi evaluată astfel:
Suma punctajelor acordate pe testele utilizate pentru verificare este 100. Astfel, soluția ta poate obține cel mult 100 de puncte, caz în care se poate considera corectă.