简单DFS,观察到n为奇数时必无解,因此直接输出,不再搜索了,否则会TLE
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
namespace
{
bool primes[50];
bool used[20];
vector<int> stack;
int n;
void init()
{
primes[2] = true;
for (int i = 3; i < 50; i += 2)
{
bool is_prime = true;
for (int j = 3; j <= i && is_prime; j++)
if (primes[j] && i % j == 0)
is_prime = false;
primes[i] = is_prime;
}
}
void dfs(int depth)
{
if (depth == n && primes[stack.front() + stack.back()])
{
for (size_t i = 0; i != stack.size(); i++)
printf(i ? " %d" : "%d", stack[i]);
putchar('\n');
}
for (int i = 1; i <= n; i++)
if (!used[i] && primes[i + stack.back()])
{
used[i] = true;
stack.push_back(i);
dfs(depth + 1);
stack.pop_back();
used[i] = false;
}
}
}
int main()
{
init();
int count = 0;
while (scanf("%d", &n) != EOF)
{
printf("Case %d:\n", ++count);
if (n % 2)
{
putchar('\n');
continue;
}
stack.clear();
memset(used, 0, sizeof(used));
stack.push_back(1);
used[1] = true;
dfs(1);
putchar('\n');
}
return 0;
}