您的位置:首页 > 其它

hdu-1016 Prime Ring Problem(素数环 dfs)

2015-05-03 16:32 435 查看
题目来源点击打开链接

经典深搜,做了好多遍。。。

给定一个数n,把从1到n个数排列成环,使得每个相邻的数的和都是素数。

首先n不可以是奇数,如果n是奇数,肯定会有两个奇数相邻的情况,则结果肯定是偶数,肯定不是素数。剪枝。。。

代码:

#include<stdio.h>
#include<string.h>

int visit[21],ring[21];

int isprime(int n)
{
int i;
for(i=2;i*i<=n;i++)
if(n%i==0)
return 0;
return 1;
}

void DFS(int k,int n)
{
int i;
if(k>n)
{
if(isprime(ring[1]+ring
))
{
printf("1");
for(i=2;i<=n;i++)
printf(" %d",ring[i]);
printf("\n");
}
else
return;
}
for(i=2;i<=n;i++)
{
if(!visit[i])
{
visit[i]=1;
ring[k]=i;
if(isprime(ring[k]+ring[k-1]))
DFS(k+1,n);
visit[i]=0;
}
}
}

int main()
{
int n,t=1;
visit[1]=ring[1]=1;
while(~scanf("%d",&n))
{
memset(visit,0,sizeof(visit));
printf("Case %d:\n",t++);
if(n==1)
printf("1\n");
//剪枝,n不可能为奇数
else if(n%2 && n!=1)
return 0;
else
DFS(2,n);
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: