天天看點

HPU 問題 H: 感恩節KK專場——陪學妹上課【規律】

問題 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;
}