#include <iostream>
#include <cstring>
using namespace std;
int num[22];
bool vis[22];
int n;
// 素数判断
bool prime(int n)
{
for(int i = 2; i *i <= n; i++)
if(n % i == 0) return false;
return true;
}
void dfs(int x)
{
// 如果最后一个与第一个和也是素数就输出
if(x == n && prime(num[x - 1] + num[0]))
{
for(int i = 0; i < n; i++)
{
if(i) cout << " ";
cout << num[i];
}
cout << endl;
return;
}
for(int i = 1; i <= n; i++)
{
// 如果这个数没有访问过且与当前数相加为素数
if(!vis[i] && prime(num[x-1] + i))
{
vis[i] = true; // 标记该点
num[x] = i;
// 测试理解递归用
// cout << i << "in" << endl;
dfs(x + 1); // 进入递归
// cout << i << "out" << endl;
vis[i] = false; // 清除标记
}
}
}
int main()
{
int kase = 0;
while(cin >> n)
{
cout << "Case " << ++kase << ":\n";
memset(vis, false, sizeof(vis));
num[0] = 1;
vis[1] = true;
dfs(1);
cout << endl;
}
return 0;
}
素数环问题 HDU1016 DFS深搜
最新推荐文章于 2019-03-07 10:37:03 发布