Cod sursa(job #230688)

Utilizator tvladTataranu Vlad tvlad Data 14 decembrie 2008 10:12:11
Problema Tablete Scor 100
Compilator cpp Status done
Runda Algoritmiada 2009, Runda 1, Clasele 5-8 Marime 1.28 kb
#include <cstdio>
#include <cassert>

const int N_MAX = 1000;

int n,k;
int a[N_MAX][N_MAX];

void rot_end ( int x ) {
	int aux = a[x+1][0];
	a[x+1][0] = a[x][k];
	for (int j = k+1; j < n; ++j) a[x][j-1] = a[x][j];
	a[x][n-1] = aux;
}

void rot_begin ( int x ) {
	int aux = a[x-1][n-1];
	a[x-1][n-1] = a[x][k];
	if (n & 1) {
		for (int j = k-1; j >= 0; --j) a[x][j+1] = a[x][j];
		a[x][0] = aux;
	} else {
		for (int j = k-1; j > 0; --j) a[x][j+1] = a[x][j];
		a[x][1] = aux;
	}
}

void check() {
	for (int i = 0; i < n; ++i) {
		assert(a[i][k] % 2 == 0);
		for (int j = 0; j < n-1; ++j) {
			assert(a[i][j] < a[i][j+1]);
		}
	}
}

int main() {
#ifdef CHECK
	for (n = 3; n <= 1000; ++n) {
		printf("n = %d\n",n);
		for (k = 1; k < n-1; ++k) {
#else
	freopen("tablete.in","rt",stdin);
	freopen("tablete.out","wt",stdout);
	scanf("%d %d",&n,&k);
	--k;
#endif

	for (int i = 0; i < n; ++i)
		for (int j = 0; j < n; ++j)
			a[i][j] = n*i + j + 1;

	for (int i = 0; i < n-1; ++i)
		if (a[i][k] & 1)
			rot_end(i);
	if (a[n-1][k] & 1)
		rot_begin(n-1);

#ifdef CHECK
			check();
		}
		printf(" OK\n");
	}
#else
	for (int i = 0; i < n; ++i) {
		for (int j = 0; j < n; ++j) {
			printf("%d ",a[i][j]);
		}
		printf("\n");
	}
#endif
	return 0;
}