NYOJ 488 素数环

来源:互联网 发布:唐筛检查结果数据分析 编辑:程序博客网 时间:2024/06/07 02:05

题目链接
果然程序是需要自己打一遍的,虽然之前也已经提交过素数环的代码,但是不经过自己思考的代码自己还是打不出来。这也算是自己真正意义上的一次深搜代码吧,往往是思路清晰,却写不出代码。。
通过这个题目,我觉得写伪代码来理清思路也是很好用的一种方法。。
同时针对这个题目,n为奇数时是没有答案的,n为偶数时一定有符合条件的排列(我还没搞清楚为什么),当n=1时答案为1,还有一点就是深搜代码能够自动输出所有的情况。。
附代码

#include<stdio.h>#include<iostream>#include<string.h>#include<algorithm>#include<stack>using namespace std;int n,k;int visit[25];int dis[25];int a[25]={2,3,5,7,11,13,17,19,23,29,31,37,41};bool prim(int num){    for(int i=0;i<13;i++)    {        if(a[i]==num)            return true;    }    return false;}void dfs(int i,int sum){    if(sum==n)    {        if(prim(dis[sum-1]+1))        {            for(int j=0;j<n-1;j++)            {                printf("%d ",dis[j]);            }            printf("%d\n",dis[n-1]);        }//        else//        {//            printf("No Answer\n");//        }    }    visit[i]=1;    for(int j=2;j<=n;j++)    {        if(prim(dis[sum-1]+j)&&visit[j]==0)        {            visit[j]=1;            dis[sum]=j;            dfs(j,sum+1);            visit[j]=0;        }    }}int main(){    int ncase=0;    while(scanf("%d",&n)&&n)    {        memset(visit,0,sizeof(visit));        printf("Case %d:\n",++ncase);        if(n==1)        {            printf("1\n");            continue;        }        if(n%2)        {            printf("No Answer\n");            continue;        }        dis[0]=1;        dfs(1,1);    }}
0 0
原创粉丝点击