1. 程式人生 > >輸入一個奇數n,打印出一個n*n的矩陣,每個數字是從1到n*n的整數,要使每一行,每一列的數字之和都相等

輸入一個奇數n,打印出一個n*n的矩陣,每個數字是從1到n*n的整數,要使每一行,每一列的數字之和都相等

#include<stdio.h>
int a[1000][1000];
int main()
{
    int n,i,j;
    scanf("%d",&n);
    a[0][n/2]=1;
    for(i=0;i>n;i++){
        for(j=0;j<n;j++){
            a[i][j]=0;
        }
    }
    int h,l;
    h=0;
    l=n/2;
    for(i=2;i<=n*n;i++){
        if((h-1+n)%n>=0&&(l+1+n)%n>=0&&a[(h-1+n)%n][(l+1+n)%n]==0){
            a[(h-1+n)%n][(l+1+n)%n]=i;
            h=(h-1+n)%n;
            l=(l+1+n)%n;
        }
        else if((h+1+n)%n>=0&&a[(h+1+n)%n][l]==0){
                h=(h+1+n)%n;
                a[h][l]=i;
        }
        else if((h+1+n)%n>=0&&(l+1+n)%n>=0&&a[(h+1+n)%n][(l+1+n)%n]==0)
        {
            h=(h-1+n)%n;
            l=(l-1+n)%n;
            a[h][l]=i;
        }
    }
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            printf("%d ",a[i][j]);
        }
        printf("\n");
    }
    return 0;

}

要考慮三個方向,並且要按先後考慮

1:當前位置的斜上方

2:(若前一方向不行)當前方向的正下方

3:(若前一方向不行)當前方向的左上方

要注意的是雖然矩陣是n*n的,但是想的時候要把矩陣擴充套件,這就是(h-1+n)%n之類的原因