幻方

所谓“幻方”,是一个行、列为奇数的方阵,把1n²(平方)个不同的数放入方阵中,使方阵的每行、每列和每个对角线上的元素的和全部相等。

编写程序,对输入不大于15的n(方阵的阶数),打印出相应的幻方。

方法:

1)先把1放在第一行的中间位置;

2)下一个数放在上一个数的右上方;

3)若右上方已超出方阵的第一行,则下一个数放在下一列的最后一行上;

4)若右上方已超出方阵的最后一列,则下一个数放在上一行的第一列上;

5)若右上方已经有数,或右上方已超出方阵的第一行最后一列,则下一个数放在上一个数的正下方。

 (6)所有数字已经放完就结束,否则重复2~5

 

#include <stdio.h>
#include <stdlib.h>
int flag[15][15];
int main()
{
    int n;
    int col,row;
    int t;
    printf("幻方的阶数(奇数):");
    scanf("%d",&n);
    int **mat = (int**)malloc(sizeof(int*)*n);
    for(int j=0;j<n;j++)
        mat[j] = (int*)malloc(sizeof(int)*n);
    t = 1;
    mat[0][n/2] = t;
    flag[0][n/2] = 1;
    row = 0;
    col = n/2;
    while(1)
    {
        t ++;
        if(t > n*n)//放完所有数
            break;
        if(row >0 && col < n-1)
        {
            if(flag[row-1][col+1])//右上方有数,则下一个数放在上一个数的正下方
            {
                row ++;
                mat[row][col] = t;
                flag[row][col] = 1;
            }
            else{//右上方无数,则放在右上方
                row --;
                col ++;
                mat[row][col] = t;
                flag[row][col] = 1;
            }
        }
        else if(row == 0 && col == (n-1)){//右上方已超出方阵的第一行最后一列,则放在上一个数的正下方
                row ++;
                mat[row][col] = t;
                flag[row][col] = 1;
        }
        else if(row == 0){//位于第一行,下一个数放在下一列的最后一行上
            row = n-1;
            col ++;
            mat[row][col] = t;
            flag[row][col] = 1;
        }
        else{//位于最后一列,下一个数放在上一行的第一列上
            col = 0;
            row --;
            mat[row][col] = t;
            flag[row][col] = 1;
        }
    }
    for(int k=0;k<n;k++)
    {
        for(int j=0;j<n;j++)
            printf("%-4d",mat[k][j]);
        printf("\n");
    }
    return 0;
}

 

posted @ 2016-01-11 23:43  我在这儿  阅读(534)  评论(0编辑  收藏  举报