奇数阶魔方问题

 题目来自《数据结构基础——C语言版》

题目

 魔方是n x n 的矩阵,每个单元取整数值,范围从1到n2 ,要求每行每列,以及两条对角线的和都相等。下图所示为 n = 5 的魔方,相等的和数是65。
                5阶魔方

 我不会做,但是课本给出了求奇数阶魔方的方法。

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; 
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值