题目来自《数据结构基础——C语言版》
题目
魔方是n x n 的矩阵,每个单元取整数值,范围从1到n2 ,要求每行每列,以及两条对角线的和都相等。下图所示为 n = 5 的魔方,相等的和数是65。
我不会做,但是课本给出了求奇数阶魔方的方法。
Coxeter提出如下生成奇数阶(n是奇数)魔方的方法:
开始时,在魔方第一行的中间一格放1.然后重复以下步骤1.移动到左上一格,把当前的数加1放到这个位置上。如果移动时超出魔方范围,则想象与当前状态完全相同的另外一个魔方,(对齐)紧靠在超出的那条边界线上,因而可以继续。
2.如果移动到的格子已经放置过数字,则从这个格子的位置向正下方移动一格。需要注意,第2条中的“这个格子”指的是移动前的格子,即现在已经将5放置到指定的位置后,经判断确定下一个位置已经被放置1了,那么就判断5所在格子的正下方是否可以放置数字,如果正下方不为空,则继续判断正下方的下一个。
C代码
/*代码只是简单直接地翻译Coxeter的思路*/
#include <stdio.h>
#define n 5 //定义魔方的规格
void printCube(int cube[][n]){ //打印魔方
int col,row;
for(row = 0;row < n;row++){
for(col = 0;col < n;col++)
printf("%4d",cube[row][col]);
if(row < n -1)
printf("\n");
}
}
int main(){
int row,col,cube[n][n] = {0},count,temp,flag;
col = (n - 1) / 2;
row = 0; //将第一行中间位置的元素初始化为1
count = 1;
flag = -1;
while(1){
cube[row][col] = count;
if(count == n*n)
break;
temp = row;
flag = col; //暂存当前坐标
if(col > 0)
col --;
else
col = n - 1;
if(row > 0)
row--;
else
row = n - 1;
while(cube[row][col] != 0){
if(flag != -1){
col = flag;
flag = -1;
}
if(temp < n - 1)
temp++;
else
temp = 0;
row = temp;
}
count++;
}
printCube(cube); //打印结果
return 0;
}