
题目
解决代码及点评
/* 功能:打印魔方阵。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如:三阶魔方阵为 8 1 6 3 5 7 4 9 2 要求打印由 1到 的自然数构成的魔方阵。 提示:魔方阵中各数的排列规律如下: ⑴ 将“1”放在第一行中间一列; ⑵ 从“2”开始直到n×n为止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1; ⑶ 如果上一个数的行数为1,则下一个数的行数为 n(指最下一行); ⑷ 当一个数的列数为 n,下一个数的列数应为1,行数减1; ⑸ 如果按上面规则确定的位置已有数,或上一个数是第 1行第 n列时, 则把下一个数放在上一个数的下面。 */ #include<stdio.h> #include<stdlib.h> #define N 5 //N可以为任何奇数,因为偶数矩阵没有对角线,故不符合题意 void main(){ int a[N][N] = {0}; int num = 1; int i = 0; int j = N/2; int ci = 0; int cj = 0; while (1){ a[i][j] = num++; //将num当前数存入a[i][j]; ci = i; //保存i当前值; cj = j; //保存j当前值; if (ci == 0)i = N - 1; //判断上一个是否在第0行 else i--; if (cj == N - 1){ //判断上一个是否在第N-1列 j = 0; i = ci-1; } else j++; if (a[i][j] != 0 || (ci == 0 && cj == N - 1)){ //判断下一个位置是否被占有,或上一个是否在第0行,第N-1列 i = ci+1; j = cj; } int flag = 0; for (int u = 0; u < N; u++){ //判断矩阵是否已满 int flag1 = 0; for (int v = 0; v < N; v++){ if (a[u][v] == 0){ flag1 = 1; break; } } if (flag1 == 1){ flag = 1; break; } } if (flag == 0)break; //flag=0说明矩阵已经填满,跳出循环 } for (int u = 0; u < N; u++){ //打印矩阵 for (int v = 0; v < N; v++){ printf("%3d",a[u][v]); } printf("\n"); } system("pause"); }
代码编译以及运行
由于资源上传太多,资源频道经常被锁定无法上传资源,同学们可以打开VS2013自己创建工程,步骤如下:
1)新建工程
2)选择工程
3)创建完工程如下图:
4)增加文件,右键点击项目
5)在弹出菜单里做以下选择
6)添加文件
7)拷贝代码与运行
程序运行结果