/*
HDU 1016
*/
#include <iostream>
#include <stdio.h>
using namespace std;
int num[21],mark[21],n;//数组num 储存需输出的结果
int prim(int t)//判断是否为素数
{
for(int i=2;i*i<=t;i++)
if(t%i==0)
return 0;
return 1;
}
void print_num()//输出一次结果
{
for(int i = 1; i < n;i++)//循环输出所有num
printf("%d ",num[i]);
printf("%d",num[n]);
}
int dfs(int pre,int post,int flag)//pre为前一个数,post为后一个数,flag 为第几个节点
{
if(!prim(pre+post))//若相加不为素数,直接返回0
return 0;
num[flag]=post;//若相加为素数 则存入num的第flag个元素中
if(flag==n&&prim(post+1))//直至循环至最后一次即post=n且 最后数加第一个数1也为素数输出结果
{
print_num();
printf("\n");
return 1;
}
mark[post]=0;//mark中第post个元素置零----用过的数置为零
for(int i = 2;i<=n;i++)
if(mark[i]!=0&&dfs(post,i,flag+1))//mark中第i个元素未被置零(即未被用过)
//且下一个节点返回值为1(即下一结点为素数)
break; //跳出循环
mark[post]=1;//未被用过的数置为一
return 0;
}
int main()
{
int count;
count=1;
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
mark[i]=i;
num[1]=1;
printf("Case %d:\n",count++);
if(n==1)printf("1\n");
for(int i = 2;i<=n;i++)
dfs(1,i,2);//递归
printf("\n");
}
}
Prime Ring Problem(搜索 深度优先)
最新推荐文章于 2016-05-16 20:21:58 发布