杭电 HDU ACM 1016 Prime Ring Problem

#include<iostream>#include<string.h>#include<list>using namespace std;int prime[41],visited[21],step,n;list<int>cnt;void Prime()// 素数打表判定{memset(prime,0,sizeof(prime));for(int i=2; i<=41; i++){if(!prime[i]){for(int j=i+i; j<=41; j+=i)prime[j]=1;}}prime[1]=1;}void dfs(int k){if(step==n&&!prime[k+1]) //某次搜索结束条件,也即如果出现某条满足题意搜索,输出即可{cout<<1;for(list<int>::iterator it=cnt.begin(); it!=cnt.end(); it++)cout<<" "<<(*it);cout<<endl;return ;}else if(k&1)//如果为奇数,,那么为了和下一个数的加和为素数,只能在奇数中搜索{for(int i=2; i<=n; i+=2){if(!visited[i]&&!prime[k+i])//如果某个结点未搜索过,且满足和k加和为素数{cnt.push_back(i);visited[i]=1; //标记已被访问step++;dfs(i);visited[i]=0;//回溯到上次结点处step–;cnt.pop_back();}}}else if(!(k&1)){for(int p=3; p<=n; p+=2){if(!visited[p]&&!prime[p+k]){cnt.push_back(p);visited[p]=1;step++;dfs(p);visited[p]=0;step–;cnt.pop_back();}}}return ;}int main(){int t=0;while(cin>>n){cout<<"Case "<<++t<<":"<<endl;memset(visited,0,sizeof(visited));Prime();//if(n&1)//continue;visited[1]=1;step=1;dfs(1);cnt.clear();cout<<endl;}return 0;}

你的选择是做或不做,但不做就永远不会有机会

杭电 HDU ACM 1016 Prime Ring Problem

相关文章:

你感兴趣的文章:

标签云: