题目大意:是求一个素数环
解题思路:简单的dfs,卡在求最后一个数,它不光与1相加为素数和后面的那个数相加也得为素数,漏了后面那个,wa了好几次。
另外要是n为奇数不能成为素数环,因为奇数的个数比偶数多一个,所以至少会有一对相邻的两个数是奇数,这两个数的和不可能是素数。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const int maxn = 21;
int result[maxn];
bool hash[maxn];
int n;
void dfs(int depth);
inline bool isPrim(int num);
int main()
{
int test = 1;
while(scanf("%d", &n) != EOF)
{
printf("Case %d:\n", test++);
if(n % 2 == 1)
{
printf("\n");
continue;
}
memset(hash, 0, sizeof(hash));
result[0] = 1;
hash[1] = true;
dfs(1);
printf("\n");
}
return 0;
}
void dfs(int depth)
{
if(depth == n - 1)
{
int i;
for(i = 2; i <= n; i++)
{
if(!hash[i])
{
if(isPrim(i + 1) && isPrim(i + result[depth - 1]))
{
for(int j = 0; j < n - 1; j++)
printf("%d ", result[j]);
printf("%d\n", i);
return;
}
}
}
return;
}
for(int i = 2; i <= n; i++)
{
if(!hash[i])
{
if(isPrim(i + result[depth-1]))
{
result[depth] = i;
hash[i] = true;
dfs(depth + 1);
hash[i] = false;
}
}
}
}
inline bool isPrim(int num)
{
if(num == 1 || num == 2)
return true;
int val = (int) sqrt(double (num));
int i;
for(i = 2; i <= val; i++)
{
if(num % i == 0)
return false;
}
return true;
}