Cod sursa(job #235077)
#include <iostream>
#include <fstream>
using namespace std;
int N, K;
long *M;
void f(int l1, int l2)
{
int t1 = M[l1 * N + 0];
int t2 = M[l2 * N + N - 1];
for (int k = 0; k < N - 1; k++)
M[l1 * N + k] = M[l1 * N + k + 1];
for (int k = N - 1; k > 0; k--)
M[l2 * N + k] = M[l2 * N + k - 1];
M[l1 * N + N - 1] = t2;
M[l2 * N] = t1;
}
int main()
{
ifstream in("tablete.in");
in >> N >> K;
in.close();
M = new long[N * N];
for (int i = 0; i < N * N; i++)
M[i] = i + 1;
if (N % 2 == 0) {
if (K % 2 == 0) {
// do nothing
} else {
for (int i = 0; i < N / 2; i++) {
int l1 = i * 2;
int l2 = i * 2 + 1;
f(l1, l2);
}
}
} else {
if (K % 2 == 0) {
for (int i = 0; 4 * i + 3 < N; i++) {
int l1 = i * 4 + 1;
int l2 = i * 4 + 3;
f(l1, l2);
}
// correct last line
if (((N - 1) / 2) % 2 == 1) {
int l = N - 2;
int t = M[l * N];
for (int i = 0; i < N - 1; i++)
M[l * N + i] = M[l * N + i + 1];
M[l * N + N - 1] = M[(N - 1) * N];
M[(N - 1) * N] = t;
}
} else {
for (int i = 0; 4 * i + 2 < N; i++) {
int l1 = i * 4;
int l2 = i * 4 + 2;
f(l1, l2);
}
// correct last line
if (((N + 1) / 2) % 2 == 1) {
int l = N - 1;
int t = M[l * N + N - 1];
for (int i = N - 1; i > 0; i--)
M[l * N + i] = M[l * N + i - 1];
M[l * N] = M[(N - 2) * N + N - 1];
M[(N - 2) * N + N - 1] = t;
}
}
}
ofstream out("tablete.out");
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++)
out << M[i * N + j] << " ";
out << endl;
}
out.close();
return 0;
}