POJ1016 素数环DFS+打表

来源:互联网 发布:腾讯linux运维面试题 编辑:程序博客网 时间:2024/06/06 04:16

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

题意: 输入一个N, 让你在1-N个数字中找到一个序列满足   相邻两个相加为质数   

数据规模不会很打,打表加DFS搜索到所有数字进栈。注意最后要判断 最后一个数跟1是否满足条件


#include<stdio.h>#include<cmath>#include<iostream>#include<algorithm>#include<string.h>#include<queue>using namespace std;int p[40], vis[20],result[20];int n;void DFS(int begin, int num)    // begin表示前一个字母,num表示后一个字母{    int i, j;    if(num == n && p[result[1]+result[num]])   //递归边界。注意测试第一个数和最后一个数    {        for(i=1; i<n; ++i)    //打印方案            printf("%d ",result[i]);            printf("%d",result[i]);        printf("\n");        return;    }    for(i=2; i<=n; ++i)       //尝试放置每一个数i        if(p[begin+i] && vis[i] == 0)        {            result[num+1] = i;            vis[i] = 1;            DFS(i, num+1);            vis[i] = 0;        }}int main(){    p[2] = p[3] = p[5] = p[7] = p[11] = p[13] = p[17]    = p[19] = p[23] = p[29] = p[31] = p[37] = 1;    int i, nCases = 1;    while(scanf("%d", &n) != EOF)    {        printf("Case %d:\n", nCases++);        result[1] = 1;        if(n%2 == 0)        //偶数个不可能            DFS(1, 1);        printf("\n");        memset(vis, 0, sizeof(vis));    }    return 0;}


0 0