HDU 1016 Prime Ring Problem

来源:互联网 发布:员工网络和访客网络 编辑:程序博客网 时间:2024/06/06 17:29

这题我用的是DFS。不多说,看代码和注释。

#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<vector>using namespace std;
//因为n<20,所以最大的素数也就是40左右,因此用一个数组来记录45以内的素数,用于之后的判定。bool isprime[45]={0,1,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,1,0};int n;bool visited[24];//用于标记是否被访问过void dfs(int cnt,int id,int ans[]){    if(cnt==n+1)    {        printf("%d",ans[1]);        for(int i=2;i<=n;i++)            printf(" %d",ans[i]);        printf("\n");        return;    }    for(int i=2;i<=n;i++)    {        if(visited[i]||i==id)            continue;        visited[i]=true;        if(cnt==n)//这里注意要区分是不是到达第n个数,如果到达因为是圆环,所以还要判定和1相加是不是素数。        {            int t1=ans[cnt-1]+i;            int t2=i+1;            if(isprime[t1]&&isprime[t2])            {                ans[cnt]=i;                dfs(cnt+1,i,ans);            }        }        else//否则就判断和前一个数相加是不是素数        {            int t=ans[cnt-1]+i;            if(isprime[t])            {                ans[cnt]=i;                dfs(cnt+1,i,ans);            }        }        visited[i]=false;//记得恢复    }}int main(){    int k=1;    while(scanf("%d",&n)!=EOF)    {        int ans[25];        ans[1]=1;        memset(visited,false,sizeof(visited));        visited[1]=true;        printf("Case %d:\n",k++);        dfs(2,1,ans);        printf("\n");    }    return 0;}


0 0
原创粉丝点击