题目描述
输入描述
输出描述
输入样例
3
1
2
3
输出样例
1
-1
2 9 7
4 6 3
1 8 5
题目大意: 给定一个 n * n 的矩阵,需要在该矩阵中填上 1 ~ n * n 个数,使得每个方格与它相邻(上下左右)的方格中的数字不相邻( 即两数差的绝对值不为1 ),求是否能构造出符合要求的矩阵并输出任意一种可行的方案。
理所当然的规律 + 构造题,看样例的时候脑子一热觉得是奇数行偶数不行,然而很被驳回了。由于规定相邻的方格中的数字不能相邻,因此可以考虑通过 + 2 避过相邻数字,即按顺序将奇数和偶数分开存放,例当 n = 4 时 ,可构造为:
1 3 5 7
9 11 13 15
2 4 6 8
10 12 14 16
由此可发现只有当 n = 1 或 n = 2 时需要分类讨论,而对于其他情况,则根据数字大小先输出奇数再输出偶数即可。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int n,flag=0;
cin>>n;
if(n==1){
cout<<"1"<<endl;
continue;
}
if(n==2){
cout<<"-1"<<endl;
continue;
}
int pos=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
printf("%d ",pos);
pos+=2;
if(pos>n*n&&flag==0){
flag=1;
pos=2;
}
}
cout<<endl;
}
cout<<endl;
}
}