这个题就是直接回溯的方法结合紫书上写的,学习一波回溯。 我这个没有打表直接判断的时候是素数,没有超时,
#include <iostream>
#include <cstdio>
#include <iomanip>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
const int maxn = 1000 + 10;
int vis[maxn];
int A[maxn] = {0};
int num;
int judge(int n)
{
for(int i = 2; i <= sqrt(n); i++)
{
if(n % i == 0)
return 0;
}
return 1;
}
void dfs(int cur)
{
if(num == cur && judge(A[0] + A[num - 1]))
{
for(int i = 0; i < num; i++)
{
if(i == 0)
printf("%d",A[i]);
else
printf(" %d",A[i]);
}
putchar('\n');
}
else
{
for(int i = 2; i <= num; i++)
{
if(!vis[i] && judge(i + A[cur - 1]))
{
A[cur] = i;
vis[i] = 1;
dfs(cur+1);
vis[i] = 0;
}
}
}
}
int main()
{
int num1 = 0;
while(scanf("%d",&num) != EOF)
{
memset(vis,0,sizeof(vis));
if(num1)
printf("\n");
printf("Case %d:\n",++num1);
A[0] = 1;
vis[0] = 1;
dfs(1);
}
return 0;
}