#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
#include <iomanip>
using namespace std;
const int N = 5;
int b[N][N];
int er = N-1, ec = N-1;
int coord(int r, int c) { return r*N+c; }
void move()
{
int olr = er, olc = ec;
for(bool ok = false;!ok;)
{
switch(rand()%4)
{
case 0: if (er > 0) { er--; ok = true; } break;
case 1: if (ec < N-1) { ec++; ok = true; } break;
case 2: if (er < N-1) { er++; ok = true; } break;
case 3: if (ec > 0) { ec--; ok = true; } break;
}
}
cout << er << " <> " << ec << endl;
int t = b[olr][olc];
b[olr][olc] = b[er][ec];
b[er][ec] = t;
}
bool invariant()
{
const int M = N*N - 1;
int a[M];
for(int k = 0, i = 0; i < N; ++i)
for(int j = 0; j < N; ++j)
if (b[i][j]) a[k++] = b[i][j];
for(int i = 0; i < M; ++i) cout << a[i] << " "; cout << endl;
int sum = 0;
for(int i = 0; i < M - 1; ++i)
for(int j = i+1; j < M; ++j)
if (a[i] > a[j]) sum++;
sum += er+1;
cout << sum << endl;
return sum%2 == N%2;
}
int main(int argc, char * argv[])
{
for(int k = 0, i = 0; i < N; ++i)
for(int j = 0; j < N; ++j)
b[i][j] = ++k;
b[N-1][N-1] = 0;
for(;;)
{
move();
if (!invariant())
{
cout << "Error!!!!!\n";
break;
}
}
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTiA9IDU7CgppbnQgYltOXVtOXTsKaW50IGVyID0gTi0xLCBlYyA9IE4tMTsKCmludCBjb29yZChpbnQgciwgaW50IGMpIHsgcmV0dXJuIHIqTitjOyB9Cgp2b2lkIG1vdmUoKQp7CiAgICBpbnQgb2xyID0gZXIsIG9sYyA9IGVjOwogICAgZm9yKGJvb2wgb2sgPSBmYWxzZTshb2s7KQogICAgewogICAgICAgIHN3aXRjaChyYW5kKCklNCkKICAgICAgICB7CiAgICAgICAgY2FzZSAwOiBpZiAoZXIgPiAwKSAgIHsgZXItLTsgb2sgPSB0cnVlOyB9IGJyZWFrOwogICAgICAgIGNhc2UgMTogaWYgKGVjIDwgTi0xKSB7IGVjKys7IG9rID0gdHJ1ZTsgfSBicmVhazsKICAgICAgICBjYXNlIDI6IGlmIChlciA8IE4tMSkgeyBlcisrOyBvayA9IHRydWU7IH0gYnJlYWs7CiAgICAgICAgY2FzZSAzOiBpZiAoZWMgPiAwKSAgIHsgZWMtLTsgb2sgPSB0cnVlOyB9IGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIGNvdXQgPDwgZXIgPDwgIiA8PiAiIDw8IGVjIDw8IGVuZGw7CiAgICBpbnQgdCA9IGJbb2xyXVtvbGNdOwogICAgYltvbHJdW29sY10gPSBiW2VyXVtlY107CiAgICBiW2VyXVtlY10gPSB0Owp9Cgpib29sIGludmFyaWFudCgpCnsKICAgIGNvbnN0IGludCBNID0gTipOIC0gMTsKICAgIGludCBhW01dOwogICAgZm9yKGludCBrID0gMCwgaSA9IDA7IGkgPCBOOyArK2kpCiAgICAgICAgZm9yKGludCBqID0gMDsgaiA8IE47ICsraikKICAgICAgICAgICAgaWYgKGJbaV1bal0pIGFbaysrXSA9IGJbaV1bal07CgogICAgZm9yKGludCBpID0gMDsgaSA8IE07ICsraSkgY291dCA8PCBhW2ldIDw8ICIgIjsgY291dCA8PCBlbmRsOwoKICAgIGludCBzdW0gPSAwOwogICAgZm9yKGludCBpID0gMDsgaSA8IE0gLSAxOyArK2kpCiAgICAgICAgZm9yKGludCBqID0gaSsxOyBqIDwgTTsgKytqKQogICAgICAgICAgICBpZiAoYVtpXSA+IGFbal0pIHN1bSsrOwoKICAgIHN1bSArPSBlcisxOwoKICAgIGNvdXQgPDwgc3VtIDw8IGVuZGw7CiAgICByZXR1cm4gc3VtJTIgPT0gTiUyOwp9CgoKCgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqIGFyZ3ZbXSkKewogICAgZm9yKGludCBrID0gMCwgaSA9IDA7IGkgPCBOOyArK2kpCiAgICAgICAgZm9yKGludCBqID0gMDsgaiA8IE47ICsraikKICAgICAgICAgICAgYltpXVtqXSA9ICsrazsKICAgIGJbTi0xXVtOLTFdID0gMDsKCiAgICBmb3IoOzspCiAgICB7CiAgICAgICAgbW92ZSgpOwogICAgICAgIGlmICghaW52YXJpYW50KCkpCiAgICAgICAgewogICAgICAgICAgICBjb3V0IDw8ICJFcnJvciEhISEhXG4iOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9Cn0K