https://codeforces.com/problemset/problem/1520/C
思路:我的思路比较丑,就是隔一个格子填一个,然后两次循环就可以填满了,不过这种方法不能构造出 n=3 的情况,没办法我只好打表了,后来看了另一位师傅的博客,发现每次填对角线也可以构造,不像我这个3还得手打...
以下是代码实现:
#include<iostream>
#include<cstdio>
using namespace std;
int board[110][110];
void solved()
{
int n;
cin>>n;
if(n==2)
{
printf("-1\n");
return ;
}
int cnt=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j+=2)
{
board[i][j]=cnt++;
}
}
for(int i=1;i<=n;i++)
{
for(int j=2;j<=n;j+=2)
{
board[i][j]=cnt++;
}
}
if(n==3)//确实打表...
{
printf("2 9 7\n");
printf("4 6 3\n");
printf("1 8 5\n");
return ;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
printf("%d ",board[i][j]);
}
printf("\n");
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
solved();
}
return 0;
}