您的位置:首页 > 其它

hdu 1016 Prime Ring Problem(深度优先搜索)

2016-02-01 12:01 351 查看

Prime Ring Problem

Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 12105 Accepted Submission(s): 5497

[align=left]Problem Description[/align]
A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent circles should be a prime.
Note: the number of first circle should always be 1.

#include<iostream>
#include<cstring>
#define N 25
#define M 40
using namespace std;

bool is_prime[M],visited
;
int n,test,ans
;

void work(int k)
{
int i;
if(k==n+1)
{
if(!is_prime[ans
+ans[1]]) return ;
for(i=1;i<=n-1;i++)
cout<<ans[i]<<" ";
cout<<ans[i]<<endl;
return ;
}
for(i=2;i<=n;i++)
{
if(!visited[i]&&is_prime[ans[k-1]+i])
{
visited[i]=true;
ans[k]=i;
work(k+1);
visited[i]=false;
}
}
}

bool prime(int n)
{
if(n==1) return false;
if(n==2||n==3) return true;
int i;
for(i=2;i<n;i++)
if(n%i==0)
return false;
return true;
}

int main()
{
int i;test=1;
for(i=1;i<M;i++) is_prime[i]=prime(i);
while(cin>>n)
{
ans[1]=1;
memset(visited,false,sizeof(visited));
cout<<"Case "<<test<<":"<<endl;
work(2);
test++;
cout<<endl;
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: