暴力深搜,注意找到解时的停止
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN = 20;
int a[MAXN], vis[MAXN], prime[2 * MAXN];
//a为存储目标序列,vis判断每个数字是否“已读”, prime存储是否素数
int n;
void iniPrime() {//素数数组初始化
memset(prime, 0, sizeof(prime));
prime[2] = 1;
prime[3] = 1;
for(int i = 4; i < 2 * MAXN; i++)
for (int j = 2; j <= (int)sqrt(i); j++) {
if (i % j == 0) break;
if (j == (int)sqrt(i)) prime[i] = 1;
}
}
int isPrime(int k) {
return prime[k];
}
void dfs(int k, int time) {
if (time > n) return;//time大于给定输入时直接返回
if (time == n && isPrime(k + 1)) {
//数字个数刚好为输入要求时,进行判断,满足要求则为一个解。因判断顺序是以经按照字典序进行的,故只要得到满足地解直接输出即可
for (int i = 0; i < time - 1; i++)
cout << a[i] << " ";
cout << a[time - 1] << endl;
return;
}
for (int i = 2; i <= n; i++)
if (isPrime(k + i) && vis[i] == 0) {//与相邻数和为素数则进行下一步
vis[i] = 1;
a[time] = i;
dfs(i, time + 1);
vis[i] = 0;
}
}
int main() {
int t = 1;
memset(a, 0, sizeof(a));
memset(vis, 0, sizeof(vis));
a[0] = 1;
vis[0] = 1;
iniPrime();
while (cin >> n) {
cout << "Case " << t++ << ":" << endl;
dfs(1, 1);
cout << endl;
}
}