//http://acm.hdu.edu.cn/showproblem.php?pid=1016
//经典深搜搜索的一个题
#include<stdio.h>
#include<string.h>
int vis[21];//标记
int dis[21];
int n;
int prime[] = {0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0};
//素数表 0--非素数 ,1--素数;
void dfs(int x)//深搜
{
int i;
if(x==n+1)
{
if(prime[dis[x-1]+1])//判断1加上最后一个数是否为素数
{
for(i=1;i<=n;i++)
{
printf("%d%c",dis[i],i==n?'\n':' ');//输出这个素数环,返回是那个一层搜索
}
}
}
else
{
for(i=2;i<=n;i++)
{
if(vis[i]==0&&prime[i+dis[x-1]])//该数是否被标记,以及前一个数加上现在的数是否是素数
{
vis[i]=1;//标记
dis[x]=i;//记录数
dfs(x+1);//继续搜下去
vis[i]=0;
}
}
}
}
int main(void)
{
int count = 1;
while(scanf("%d",&n)!=EOF)
{
memset(vis,0,n);
printf("Case %d:\n",count);
dis[1]=1;
dfs(2);
printf("\n");
count++;
}
return 0;
}
HDU 1016 http://acm.hdu.edu.cn/showproblem.php?pid=1016
最新推荐文章于 2019-07-26 14:14:00 发布