Cod sursa(job #235077)

Utilizator mist000000 mist Data 22 decembrie 2008 20:03:14
Problema Tablete Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#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;
}