思路
这是一道简单的搜索题,简单说就是一位一位去试,一位一位地填上数字,看是否满足条件,具体看注释。
代码
#include <cstring>
#include <cstdio>
using namespace std;
// 素数表,数据较小直接打表也可以
bool prime[41];
void init()
{
memset(prime, true, sizeof(prime));
prime[0] = prime[1] = false;
for(int i=2; i<=40; i++)
{
if(prime[i])
{
for(int j=i*2; j<=40; j+=i) prime[j] = false;
}
}
}
// 标记
bool vis[21];
int num[21];
int N, t=1;
void dfs(int n)
{
if(n == N && prime[1+num[n]])
{
// 判断最后一位是否满足条件,打印
printf("1");
for(int i=2; i<=N; i++) printf(" %d", num[i]);
printf("\n");
}
else
{
// 在还未访问的数据中选择满足条件的,标记并访问
for(int i=2; i<=N; i++)
{
if(!vis[i] && prime[i+num[n]])
{
num[n+1] = i;
vis[i] = true;
dfs(n+1);
// 访问结束,重新设为未访问
vis[i] = false;
}
}
}
}
int main()
{
init();
memset(vis, false, sizeof(vis));
vis[1] = true;
num[1] = 1;
while(scanf("%d", &N) == 1)
{
printf("Case %d:\n", t++);
dfs(1);
printf("\n");
}
return 0;
}