HDU

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016

#include <iostream>
#include <string.h>
using namespace std;
/****************************************************************************************************************
            题意:输出满足相邻的相加是素数的序列
            思路:
            1,很清晰,要用dfs,刚开始想复杂了,可能最近都在用回溯,就用回溯了,然后就傻逼了
            2,利用打素数表能优化时间
            3,千万别忘了将最后一个数和 1 要进行比较
****************************************************************************************************************/
int N;
int visit[20+5];
int f[20+5];
int fuc[40]={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};
void dfs(int num)
{
    if(num == N && fuc[f[num-1]+1]){
        for(int i = 0;i < num;i ++){
            if(i == 0)  cout<<f[i];
            else
                cout<<" "<<f[i];
        }
        cout<<endl;
    }
    for(int i = 2;i <= N;i ++){
        if(visit[i])    continue;

        if(fuc[i+f[num-1]]){
            visit[i]=1;
            f[num]=i;
            dfs(num+1);
            visit[i]=0;
        }
    }
}
int main()
{
    int num=1;
    while(cin>>N)
    {
        if(N<=0 || N>= 20)  break;
        cout<<"Case "<<num<<":"<<endl;
        num++;
        memset(visit,0,sizeof(visit));
        f[0]=1;
        dfs(1);
        cout<<endl;
    }
    return 0;
}



原文地址:https://www.cnblogs.com/Jstyle-continue/p/6352017.html