HDOJ HDU 1016 Prime Ring Problem

来源:互联网 发布:元数据和数据字典 编辑:程序博客网 时间:2024/04/26 16:09

HDOJ 1016 Prime Ring Problem

题目

点此查看 HDOJ 1016 Prime Ring Problem

分类

dfs

题意

求 1 - n 自然数的所有素数环

素数环
 相邻两数互为素数的环

例 1- 6 的一个素数环
HDOJ 1016 示例

题解

最简单的想法就是暴力枚举,要枚举 N! 个
本觉得会超时,没想到过了

技巧

n 最大为 20 ,dfs时可用32位int记录状态,节约空间

代码

#include <iostream>#include <set>#define max 20using namespace std;int n;set<int> prime; // 素数表int dfs(int * res,int df,int t);int main(){    int r[max];    int tms = 1;    prime.insert(2);    prime.insert(3);    prime.insert(5);    prime.insert(7);    prime.insert(11);    prime.insert(13);    prime.insert(17);    prime.insert(19);    prime.insert(23);    prime.insert(29);    prime.insert(31);    prime.insert(37);    prime.insert(41);    prime.insert(43);    // 由于 相邻两数 最大 20 + 19 故 打表到此足够    while(cin >> n)    {        cout << "Case " << tms++ << ":" << endl;        dfs(r,0,0);        cout << endl;    }}int dfs(int * res,int df,int t){    if(t == n)    {        if(!prime.count(res[n-1] + res[0]))            return 0;        cout << res[0];        for(int i = 1;i < n;i++)            cout << " " << res[i];        cout << endl;        return 0;    }    for(int i = 0;i < n;i++)    {        if(t == 0 && i != 0)            continue;        if(df & (1 << i))             continue;        if(t != 0 && !prime.count(res[t-1] + i+1))            continue;        df |= 1 << i;        // 位运算记录状态        res[t] = i + 1;        dfs(res,df,t+1);        df &= ~(1 << i);        // 位运算恢复状态    }    return 0;}
原创粉丝点击