链接:
http://acm.hdu.edu.cn/showproblem.php?pid=3927
真不想多说。。随便搞。。。
用
1 2 3 16
4 5 6 15
7 8 9 14
10 11 12 13 的方法构造出来。
然后随便(或者说随机)调整一下。。然后就过了。。。
只能说明幻方的解集很小,反幻方的解集太大了吧。。随便就能够造出来。。。n=3记得特判就好。
代码:
#include <iostream>
#include <cstdio>
using namespace std;
#define maxn 205
int mat[maxn][maxn];
void gao()
{
int n;
scanf("%d",&n);
if(n == 3)
{
mat[1][1] = 7;
mat[1][2] = 5;
mat[1][3] = 2;
mat[2][1] = 1;
mat[2][2] = 4;
mat[2][3] = 8;
mat[3][1] = 3;
mat[3][2] = 6;
mat[3][3] = 9;
}
else
{
int cnt = 1;
for(int i = 1;i <= n - 1;i++)
for(int j = 1;j <= n - 1;j++)
mat[i][j] = cnt++;
for(int j = 1;j <= n;j++)
mat[n][j] = cnt++;
for(int i = n - 1;i >= 1;i--)
mat[i][n] = cnt++;
for(int i = 1;i <= n/2;i++)
swap(mat[i][n],mat[n][n-i+1]);
}
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++)
printf("%d%c",mat[i][j],(j==n)?'\n':' ');
}
int main()
{
int t;
scanf("%d",&t);
for(int i = 1;i <= t;i++)
{
printf("Case #%d:\n",i);
gao();
}
}
Ctrl+v