欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

六角填数之全排列

程序员文章站 2023-12-23 17:15:33
...

算法步骤

(1)为需要填充的所有点规定一个顺序,按照该顺序确定一个满足行和都相等的模型;
(2)将所有可以填充的数字进行全排列,也就是这些数字组合的所有可能(这里的全排列通过递归来实现,采用树形分解法);
(3)将步骤(2)全排列结果依次带入步骤(1),直到找到满足条件的组合。

实例以及代码

问题描述:在如图所示的六角形中,每一个圆圈都可以填入一个数字,现需要将整数1-12填入,使得填入后的每条直线的和都相等。问红色星号处填入的数字是多少?
六角填数之全排列

实例代码

//未填入的数字
int data[9]={2,4,5,6,7,9,10,11,12};
//判断目前的填入方式是否满足条件
int judge(){
	int num[7],i;
	int a[13] = {0}; // 代表那12个圈中的数
	// 第一、二、十二个圈中都有数 
	a[1] = 1, a[2] = 8, a[12] = 3; 
	for(i=0;i<9;i++)
		a[i+3]=data[i];
	num[1] = a[1] + a[3] + a[6] + a[8];
	num[2] = a[1] + a[4] + a[7] + a[11];
	num[3] = a[2] + a[3] + a[4] + a[5];
	num[4] = a[2] + a[6] + a[9] + a[12];
	num[5] = a[5] + a[7] + a[10] + a[12];
	num[6] = a[8] + a[9] + a[10] + a[11];
	for(i = 2; i < 7; i++){
		if(num[i] != num[i - 1])
			return 0;
	}
	return a[6];	
}
//对未填入数字进行全排列
void FullPermutation(int start,int end){
	int i,t;
	if(start==end)  //对每一个全排列进行验证
	{
		if(judge())
			printf("红色星号位置应填入:%d",judge());
	}
	else
	{
		for(i=start;i<=end;i++)
	    {
			t=data[i];
			data[i]=data[start];
			data[start]=t;
			FullPermutation(start+1,end);
			data[start]=data[i];
			data[i]=t;
	    }
	}
}
int main(){
    FullPermutation(0,8);
	return 0; 
}

运行结果

六角填数之全排列

上一篇:

下一篇: