Cod sursa(job #235070)

Utilizator mist000000 mist Data 22 decembrie 2008 19:41:52
Problema Tablete Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 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 {
		for (int i = 0; i < N / 4; i++) {
			int l1 = i * 4;
			int l2 = i * 4 + 2;
			f(l1, l2);
		}
		// correct last line
		if (K % 2 == 0) {
			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 {
			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;
}