杭电 Prime Ring Problem 1016 DFS

来源:互联网 发布:java adt是什么 编辑:程序博客网 时间:2024/05/29 15:44

http://acm.hdu.edu.cn/showproblem.php?pid=1016

趁老板没有召见之前,再水几个题

直接深搜:

#include<cstdio>#include<iostream>#include<cstring>#include<set>using namespace std;int n;set<int>se;int num[21];bool vis[21];void print(){for(int i=1;i<n;i++)printf("%d ",num[i]);printf("%d\n",num[n]);}void bfs(int i){if(i==n+1)print();else{//为第i个位置上的数确定一个数for(int j=2;j<=n;j++)if(i==n)//最后一个数多考虑一下{if(!vis[j] && se.find(j+num[i-1])!=se.end() && se.find(j+1)!=se.end()){vis[j]=true;num[i]=j;bfs(i+1);vis[j]=false;}}else{if(!vis[j] && se.find(j+num[i-1])!=se.end()){vis[j]=true;num[i]=j;bfs(i+1);vis[j]=false;}}}}int main(){int prime[12]={2,3,5,7,11,13,17,19,23,29,31,37};for(int i=0;i<12;i++)se.insert(prime[i]);int k=1;while(~scanf("%d",&n)){memset(num,0,sizeof(num));memset(vis,0,sizeof(vis));printf("Case %d:\n",k++);num[1]=1;vis[1]=1;bfs(2);printf("\n");}return 0;}