HDOJ 1016 Prime Ring Problem
题目
分类
dfs
题意
求 1 - n 自然数的所有素数环
素数环
相邻两数互为素数的环例 1- 6 的一个素数环
题解
最简单的想法就是暴力枚举,要枚举 N! 个
本觉得会超时,没想到过了
技巧
n 最大为 20 ,dfs时可用32位int记录状态,节约空间
代码
#include <iostream>
#include <set>
#define max 20
using 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;
}