hdu 1016 prime ring 简单dfs输出

来源:互联网 发布:编程:字符串压缩 编辑:程序博客网 时间:2024/05/16 08:47

少见的一次性写对的代码

不过注意的一点是对于dfs中visited一定要记得第一次调用dfs的时候就要设置为1

还有就是险些错误的就是dfs的终止条件的判断,虽然n代表环的节点总数但是序列数组是从0开始的!



#include <iostream>

#include<cstdio>
#include<cstring>
using namespace std;
int n,k;
int visited[20];
int seq[20];
int isPrime[50];
void print()
{
    for(int i=0;i<n;i++)
        {
        if(i!=0)putchar(' ');
        printf("%d",seq[i]);
        }
        putchar('\n');
}
void  dfs(int num)
{
    if(num==n&&isPrime[seq[num-1]+1])
    {
        print();
        return ;
    }
    for(int i=2;i<=n;i++)
    {
        if(!visited[i]&&isPrime[i+seq[num-1]])
        {
            seq[num]=i;
            visited[i]=1;
            dfs(num+1);
            visited[i]=0;
        }
    }
}
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    for(int i=2;i<=40;i++)
    {
        isPrime[i]=1;
        for(int j=2;j*j<=i;j++)
        {
            if(i%j==0)
            {
                isPrime[i]=0;
                break;
            }
        }
    }
    while(scanf("%d",&n)==1)
    {
    k++;
    printf("Case %d:\n",k);
    memset(seq,0,sizeof(seq));
    memset(visited,0,sizeof(visited));
    visited[1]=1;
    seq[0]=1;
    dfs(1);
    putchar('\n');
    }
    return 0;
}
0 0