您的位置:首页 > 其它

HDOJ  1016   Prime Ring Problem

2015-12-18 18:07 531 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1016

题解:

素数环:由1到n个数构成一个环,其中环内任意2个相邻的数字之和是素数。


比较经典的搜索题,由于n<20,可以先预处理出前40个自然数中的素数,然后深搜某个位置的未被访问过的数字和它相邻位置的数字之和是否为素数,搜索退出的条件为最后一个位置的数字circle
+1是否为素数。一次搜索完成后,要回溯,否则只会输出一组解。

#include <iostream>

#include <cstring>

using namespace std;

const int MAXN = 41;

bool visit[MAXN];

int n,p[MAXN],circle[MAXN];

void prime(){

int
i,j;


memset(p,true,sizeof(p));


for(i=2;i<MAXN;i++)


for(j=2;i*j<MAXN;j++)


p[i*j]=false;

}

void dfs(int c,int cnt){

if(cnt==n
&& p[circle[1]+circle
]){


for(int i=1;i<n;i++)


cout<<circle[i]<<'
';


cout<<circle
<<endl;

}

for(int
i=1;i<MAXN;i++)


if(p[i+c] && i<=n
&& !visit[i]){


circle[cnt+1]=i;


visit[i]=true;


dfs(i,cnt+1);


visit[i]=false;


}

}

int main(){

int
c=1;


prime();


while(cin>>n){


memset(visit,false,sizeof(visit));


cout<<"Case
"<<c++<<":"<<endl;


visit[1]=true,circle[1]=1;


dfs(1,1);


cout<<endl;

}

return
0;

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