题目描述:
填入1~12的数字。使得每条直线上的数字之和都相同。
图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?
题目类型:回溯算法
解题思路:
现在对于一个关于一定范围内的数字问题 ,尤其是互不相同的,不管是一维,二维,环或者说是无规则的图形,我的第一思考是回溯,比如一维的像数字排列,二维的拉丁矩阵、数独问题,首尾相连的素数环问题。我都是用相同的补充数字方法。(该方法的步骤我在数字排列中有讲述)
圈1,圈8,圈3是已经填好的数字,现在我只需要将剩下的9个数字,利用回溯,填入到相应的位置。
代码如下:(严禁抄袭,请尝试自己动手实现。——Ldu1403)
#include<stdio.h>
#define n 12
int a[n+1]={0}; //统计已经使用过的数字,0代表未使用
int temp[n]={0};//图中的每个位置
void traceback(int num)
{
int i,j;
if(num==10) {
int b[6]={0};
b[0]=1+temp[1]+temp[4]+temp[6];
b[1]=1+temp[2]+temp[5]+temp[9];
b[2]=temp[6]+temp[7]+temp[8]+temp[9];
b[3]=8+temp[1]+temp[2]+temp[3];
b[4]=8+temp[4]+temp[7]+3;
b[5]=3+temp[3]+temp[5]+temp[8];
for(j=0;j<5;j++) {
if(b[j]!=b[j+1])
return ;
}
printf("%d\n",temp[4]);
}
for(i=2;i<=12;i++) { //1-9的位置允许填入的数字范围
temp[num]=i; //填入该数字
if(a[i]==0) { //如果该数字未使用过,traceback则+1
a[i]=i;//记录一下该数字已经使用了
traceback(num+1);
a[i]=0;
}
temp[num]=0;
}
}
int main()
{
int i,j;
a[1]=1,a[3]=3,a[8]=8;
traceback(1);
return 0;
}