Prime Ring Problem(HDU1016)(A)

来源:互联网 发布:tf卡数据恢复 编辑:程序博客网 时间:2024/06/06 01:20

どこでもドア:http://acm.hdu.edu.cn/showproblem.php?pid=1016

一个环放从1到n的n个数,第一个位置一定放1。剩下的满足与之前的数相加为素数,输出所有情况。注意是环,首尾也要合法。

AC CODE:

#include<iostream>#include<cstdio>#include<algorithm>#include <cmath>#include <cstring>#include <string>#include<sstream>#include<set>#include <cstdlib>#include<map>using namespace std;const int M=32;int n,ma[M],cnt,ans[M];int pri[12]={3,5,7,11,13,17,19,23,29,31,37,39};//数据范围小,所有和的素数直接写出来了。int K=1;bool check(int x,int y)  //检验和是否是素数{    x+=y;    for(int i=0;i<12;i++){        if(pri[i]==x)            return 1;    }    return 0;}void DFS(int x){    if(cnt>=n) //cnt记录了放入了几个数,全合法放入后return    {//ans记录了对应位置放入的数字        if(check(ans[n-1],1)){            cout<<ans[0];        for(int i=1;i<n;i++)            cout<<" "<<ans[i];        cout<<endl;        }        return ;    }    else    {        for(int i=1;i<=n;i++)        {            if(check(i, x)&&!ma[i])//ma来记录访问的状态            {                ma[i]=1;                ans[cnt]=i;                cnt++;                DFS(i);                  //搜索后回溯到这个节点要还原访问之前的状态                ma[i]=0;                cnt--;            }        }    }    return ;}int main(){    while(cin>>n)    {        cout<<"Case "<<K++<<":"<<endl;        memset(ma,0,sizeof(ma));        cnt=1;        ans[0]=1;        ma[1]=1;        DFS(1);        cout<<endl;    }    return 0;}
0 0
原创粉丝点击