九度OJ 教程89 递归+回溯之《Prime ring problem》

来源:互联网 发布:java oracle证书有用吗 编辑:程序博客网 时间:2024/06/05 21:30

题目地址:http://ac.jobdu.com/problem.php?cid=1040&pid=88



//九度OJ 教程89 递归回溯算法之《Prime ring problem》//http://ac.jobdu.com/problem.php?cid=1040&pid=88#include<stdio.h>#include<string.h>#define MAXS 22int mark[MAXS],ans[MAXS],judge[50];//mark标记是否已经被放入数组。ans[]从1开始到n表示1节点到n节点的环。int n,count;//n是总数,count计数当前环DNS到的位置。void check(){int i;if(judge[ans[1]+ans[n]]==0||judge[ans[n]+ans[n-1]]==0)return;printf("%d",ans[1]);for(i=2;i<=n;i++){printf(" %d",ans[i]);}printf("\n");}void DNS(int k){int i;if(k==n)check();if(k>=2&&judge[ans[k]+ans[k-1]]==0)return;for(i=2;i<=n;i++){if(mark[i]==0){mark[i]=1;ans[++count]=i;DNS(count);count--;mark[i]=0;}}}int main(){int t=0,i,j;for(i=0;i<50;i++)judge[i]=1;for(i=2;i<50;i++)//素数筛选法筛选素数。{if(judge[i]==0)continue;for(j=i*i;j<50;j+=i)judge[j]=0;}while(~scanf("%d",&n)){memset(mark,0,MAXS*sizeof(int));count=1;printf("Case %d:\n",++t);ans[1]=mark[1]=1;for(i=2;i<=n;i++){mark[i]=1;ans[++count]=i;DNS(2);count--;mark[i]=0;}printf("\n");}return 0;}


原创粉丝点击