hdu 1016(dfs+dp)

来源:互联网 发布:详情页美工 编辑:程序博客网 时间:2024/06/06 09:08
(1)这道题非常类似于N皇后问题,使用的是深度优先搜索方法
(2)虽然说打印要求是按照顺时针和逆时针顺序打印,其实按照从小到大的搜索顺序搜索后的结果就是符合输出顺序的。
(3)由于是20以内的数字,所以判断质数的方法是直接打表后一个简单的循环判断一下是否为质数
(4)程序中mark数组是为了标记某个数字是否使用过了,num数组存储的是数字链表的存储顺序。
#include<stdio.h>#include<string.h>#define MAX 25int a[]={2,3,5,7,11,13,17,19,23,29,31,37};int mark[20];int ans[20];int n;void Write(){int i;for(i=1;i<n;i++)printf("%d ",ans[i]);printf("%d\n",ans[i]);return ;}int Judge(int x){int i;for(i=0;i<12;i++){if(a[i]==x)return 1;}return 0;}void dfs(int pre,int pos,int num){int i;if(!mark[pos]&&Judge(pre+pos)){mark[pos]=1;num++;ans[num]=pos;if(num==n&&Judge(pos+1)){Write();mark[pos]=0;return ;}else if(num==n){mark[pos]=0;return ;}for(i=2;i<=n;i++){if(!mark[i]){dfs(pos,i,num);}}mark[pos]=0;return ;}return ;}int main(){int i,t=0;while(~(scanf("%d",&n))){t++;printf("Case %d:\n",t);for(i=2;i<=n;i++){memset(mark,0,sizeof(mark));ans[1]=1;mark[1]=1;dfs(1,i,1);}printf("\n");}return 0;}

0 0
原创粉丝点击