深搜直接过掉。一开始Case:%d这样写的,WA了好几次,郁闷死啦。不过这题的测试数据应该是有点水。
代码吧:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
#define MAX 40
int n;
int visited[MAX];
int arr[MAX];
int check(int x)
{
for(int i = 2; i <= sqrt(x); i++)
{
if(x % i == 0)
return 0;
}
return 1;
}
void DFS(int cur, int index)
{
int i;
arr[cur] = index;
visited[index] = 1;
if(cur == n)
{
if(check(arr[cur] + arr[1]))
{
printf("1");
for(i = 2; i <= n; i++)
printf(" %d", arr[i]);
printf("\n");
}
return;
}
for(i = 2; i <= n; i++)
{
if(!visited[i] && check(arr[cur] + i))
{
DFS(cur + 1, i);
visited[i] = 0;
}
}
}
int main()
{
int flag = 1;
while(cin >> n)
{
printf("Case %d:\n", flag++);
memset(visited, 0, sizeof(visited));
DFS(1, 1);
printf("\n");
}
return 0;
}