题目地址: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 22
int 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;
}