1723: 感恩节KK专场——陪学妹上课
时间限制: 1 Sec 内存限制: 128 MB提交: 60 解决: 31
[ 提交][ 状态][ 讨论版]
题目描述
KK和学妹一起去上线性代数课,号称“数学小王子”的KK,听数学课就犯困,为了使KK不睡觉,学妹决定给KK玩一个游戏,来激发KK。
游戏是这样的:给出一个N*N的矩阵,矩阵中分别填入1--N*N个数字,不允许重复,使得矩阵中每行、每列以及每条对角线上的数字之和,全部相等。
为了降低难度,学妹告诉KK,每组测试数据的第一行的正中间的数字一定为1。数据保证N为奇数。
输入
给定一个整数t(0<t<1000),表示有t组测试数据。
每组测试数据有一个奇数N(0<N<200),表示填上N*N个数字。
输出
每组测试数据输出一个N*N的矩阵,每个数字占8位,右对齐,具体格式见输出样例。
样例输入
2 3 5
样例输出
8 1 6 3 5 7 4 9 2 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9
仔细观察找规律,就第二个实例来说,1在第1行中间,然后向右移一列的最后一个是2,然后向右移一列上移一行为3,右边没列了,于是乎向上一行的第一列为4,右移一列上移一行为5,右上角有数,于是下移,然后接着右上移。。。按照这个规律填数就可以了。。。
AC-code:
#include<cstdio> #include<cstring> using namespace std; int main() { int T,n,i,j,r,c,s[205][205]; scanf("%d",&T); while(T--) { scanf("%d",&n); memset(s,0,sizeof(s)); r=1;c=(n+1)/2; for(i=1;i<=n*n;i++) { s[r][c]=i; if(r==1) { if(c+1>n) { r++; continue; } else r=n;c++; continue; } if(c==n) { if(!s[r-1][1]) { r--; c=1; continue; } else r++; continue; } if(s[r-1][c+1]) { r++; continue; } r--; c++; } for(i=1;i<=n;i++) { for(j=1;j<=n;j++) printf("%8d",s[i][j]); printf("\n"); } } return 0; }