所谓“幻方”,是一个行、列为奇数的方阵,把1~n²(平方)这n²个不同的数放入方阵中,使方阵的每行、每列和每个对角线上的元素的和全部相等。
编写程序,对输入不大于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(" "); } return 0; }