说明
将1到n(为奇数)的数字排列在nxn的方阵上,且各行、各列与各对角线的和必须相同,如下所示:
解法
一般程式语言的阵列索引多由0开始,为了计算方便,我们利用索引1到n的部份。
- 第一个数字放在第一行第一列的正*。
- 在计算向右(左)上或向下时,我们可以将索引值除以N值,如果得到余数为1就向下,否则就往右(左)上。
- 若上一个数在第一行,则下一个数放在行数为N,列数为j+1的位置。
- 若上一个数在第N列,则下一个数放在行数为i-1,列数为1的位置。
(i指行数,j指列数)
如下图所示:
#include <stdio.h>
#include <stdlib.h>
#define N 5
int main(void) {
int i, j, key;
int square[N+1][N+1] = {0};
i = 0;
j = (N+1) / 2;
for(key = 1; key <= N*N; key++) {
if((key % N) == 1) //向下填入
i++;
else { //右上填入
i--;
j++;
}
//当数在第0行时
if(i == 0)
i = N;
if(j > N) //当数在最后一行N时
j = 1;
square[i][j] = key;
}
for(i = 1; i <= N; i++) {
for(j = 1; j <= N; j++)
printf("%2d ", square[i][j]);
}
return 0;
}
Lewage
发布了3 篇原创文章 · 获赞 0 · 访问量 143
私信
关注