本文主要是介绍dfs 五星填数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
标题:五星填数
如【图1.png】的五星图案节点填上数字:1~12,除去7和11。
要求每条直线上数字和相等。
如图就是恰当的填法。
请你利用计算机搜索所有可能的填法有多少种。
注意:旋转或镜像后相同的算同一种填法。
请提交表示方案数目的整数,不要填写任何其它内容
答案:12 镜像和旋转每种个5个,故答案120/10;
#include<stdio.h>
void dfs(int n);
int check();
int visit[15];
int a[15];
int count=0;
int main()
{dfs(1);printf("%d\n",count/10);return 0;
}
int check()
{int i;int num[5];num[0]=a[2]+a[3]+a[4]+a[5];num[1]=a[1]+a[3]+a[6]+a[9];num[2]=a[2]+a[6]+a[8]+a[10];num[3]=a[1]+a[4]+a[7]+a[10];num[4]=a[5]+a[7]+a[8]+a[9];for(i=0;i<4;i++)if(num[i]!=num[i+1])return 0;return 1;
}void dfs(int n)
{int i;if(n==11){if(check()){count++;/*for(int i=0;i<10;i++){printf("%d=%d\n",i,a[i]);}printf("%d\n",count/10);*/}return ;}for( i=1;i<=12;i++){if(i!=7&&i!=11&&visit[i]==0){visit[i]=1;a[n]=i;dfs(n+1);visit[i]=0;}}
}
这篇关于dfs 五星填数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!