Codeforces 1520C. C. Not Adjacent Matrix
原题链接
简单
作者:
蓬蒿人
,
2022-03-11 13:47:27
,
所有人可见
,
阅读 187
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
// 1520C
// 题目大意
// t组测试数据 每组一个n
// 要求构造出一个矩阵 矩阵内元素是1~n*n不重不漏
// 同时要求 相邻格子内的元素不能是连续的 即使差的绝对值要>=2
/*-------------------解题思路-----------------*/
// 当时想到相邻格子差的绝对值要大于2
// 便想到利用这性质 先一行一行填奇数 奇数填完再填偶数
// 1 3 5 1 3 5 7
// 7 9 2 9 10 11 13
// 4 6 8 2 4 6 8
// 10 12 14 16
// 同时 对于n为奇数的情况 特判一下 在中心直接填上n*n
// 使得填奇数的次数与填偶数的次数相同
// 简单验证了一下似乎可行 只有n=2是无解的 然后就ac了
// 但官方的题解我看不懂 放在这里 感兴趣的可以看一下
// https://codeforces.com/blog/entry/90342
int T,n;
int main(){
scanf ("%d",&T);
while (T--){
scanf("%d", &n);
if (n==2) {puts("-1");continue;}
int a[110][110]={0};
int r,c;
r=c=0;
if (n%2) a[n/2][n/2]=n*n;//n为奇数 特判一下 把中心给填上
for (int i=1;i<=n*n;i+=2) {//填奇数
a[r][c++]=i;
if (c==n){
r++,c=0;
}
}
for (int i=2;i<=n*n;i+=2) {//填偶数
a[r][c++]=i;
if (c==n){
r++,c=0;
}
}
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
printf ("%d ",a[i][j]);
}
puts("");
}
}
return 0;
}