题目来源:http://acm.nyist.net/JudgeOnline/problem.php?pid=488
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 55;
bool IsPrime[MAXN], visit[MAXN];
int arr[MAXN];
int n;
void Check_Prime()
{
int i, j;
for(i = 2; i < 10; ++i)
{
if(IsPrime[i])
for(j = i + i; j < 55; j += i)
IsPrime[j] = false;
}
}
void DFS(int kcount, int num)
{
int i;
if(kcount == n && IsPrime[num + 1])
{
for(i = 0; i < n-1; ++i)
printf("%d ", arr[i]);
printf("%d\n", arr[i]);
}
for(int i = 2; i <= n; ++i)
{
if(!visit[i] && IsPrime[num + i])
{
visit[i] = true;
arr[kcount] = i;
DFS(kcount+1, i);
visit[i] = false;
}
}
}
int main()
{
int kcase = 1;
for(int i = 0; i < 55; ++i)
IsPrime[i] = true;
Check_Prime();
while(scanf("%d", &n) && n)
{
printf("Case %d:\n", kcase++);
memset(arr, 0, sizeof(arr));
if(n == 1)
{
printf("1\n");
continue ;
}
if(n % 2)
{
printf("No Answer\n");
continue ;
}
memset(visit, false, sizeof(visit));
arr[0] = 1;
DFS(1, 1);
}
return 0;
}