問題 H: 感恩節KK專場——陪學妹上課
時間限制: 1 Sec 記憶體限制: 128 MB
送出: 45 解決: 21
[ 送出][ 狀态][ 讨論版]
題目描述
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
#include <iostream>
#include<cstdio>
#include<cstring>
#define maxn 210
using namespace std;
int mm[maxn][maxn];
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
memset(mm,0,sizeof(mm));
int mid=n/2;
int cntx=0;
mm[1][1]=mid+2+mid*(n+1)+1;
for(int j=2;j<=mid;++j)
mm[1][j]=mm[1][j-1]+n+2;
mm[1][mid+1]=1;
for(int j=mid+2;j<=n;++j)
mm[1][j]=mm[1][j-1]+n+2;
for(int i=1;i<=n;++i)
{
int tem=mm[1][i];
for(int j=2;j<=n;++j)
{
if(tem%n==0)
mm[j][i]=tem+1;
else
mm[j][i]=tem+n+1;
if(mm[j][i]>n*n)
mm[j][i]%=n*n;
tem=mm[j][i];
}
}
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
printf("%8d",mm[i][j]);
printf("\n");
}
}
return 0;
}