TA的每日心情 | 开心 2014-6-18 08:29 |
---|
签到天数: 14 天 [LV.3]偶尔看看II
滴水大师
 
- 积分
- 2345
|
题目
解决代码及点评
- <pre code_snippet_id="91880" snippet_file_name="blog_20131202_1_2646179" class="cpp" name="code"></pre><pre code_snippet_id="91880" snippet_file_name="blog_20131202_1_2646179" class="cpp" name="code"><pre code_snippet_id="91880" snippet_file_name="blog_20131202_1_2646179" class="cpp" name="code">/*
- 功能:打印魔方阵。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如:三阶魔方阵为
- 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[j] = num++; //将num当前数存入a[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[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[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[v]);
- }
- printf("\n");
- }
- system("pause");
- }</pre><br><br></pre>
|
|