幻方
所谓“幻方”,是一个行、列为奇数的方阵,把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("\n"); } return 0; }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步