Cod sursa(job #2254237)

Utilizator flibiaVisanu Cristian flibia Data 4 octombrie 2018 21:52:48
Problema Tablete Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("tablete.in");
ofstream out("tablete.out");

int n, k, sol[1010][1010];
set <int> st, dr;

int main(){
	in >> n >> k;
	for(int i = 1; i <= (k - 1) * n; i++)
		st.insert(i);
	int v = 0;
	int cnt = 0;
	int flag = 1;
	for(int i = (k - 1) * n + 1; i <= n * n; i++)
		if(i % 2 == 0 && cnt < n){
			if(flag){
				v = i;
				flag = 0;
			}
			cnt++;
		} else {
			dr.insert(i);
		} 
	for(int i = 1; i <= n; i++, v += 2)
		sol[i][k] = v;
	if(sol[n][k] == n * n){
		for(int i = 1; i <= n; i++)
			sol[i][k] -= 2;
		dr.insert(n * n);
		st.erase(sol[1][k]);
		int x = *dr.begin();
		dr.erase(dr.begin());
		st.insert(x);
	}
	for(int i = 1; i <= n; i++)
		for(int j = 1; j < k; j++){
			sol[i][j] = *st.begin();
			st.erase(st.begin());
		}	
	for(int i = 1; i <= n; i++)
		for(int j = k + 1; j <= n; j++){
			sol[i][j] = *dr.begin();
			dr.erase(dr.begin());
		}
	if(sol[1][k] > sol[1][k + 1]){
		swap(sol[1][k], sol[1][k + 1]);
		swap(sol[1][k], sol[n][k - 1]);
	}
	for(int i = 1; i <= n; i++, out << '\n')
		for(int j = 1; j <= n; j++)
			out << sol[i][j] << ' ';
	return 0;
}