注解
1、深度优先遍历DFS(用递归解决)。要设置一个访问数组,标记每个元素是否被访问过。然后要注意设置一个计数器(访问过的元素个数),用于标记递归出口。还要注意如何写递归函数。
void dfs(int n, int value) {
count++;
parent[count] = value;
visit[value] = 1;
if(count==n) {
if(isPrime(parent[1]+value)) {
print(n);
}
} else {
for(int i=1; i<=n; i++) {
if(visit[i]==0 && isPrime(value+i)) {
dfs(n, i);
visit[i] = 0;
count--;
}
}
}
}
2、素数判断。
代码
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn = 20+1;
int visit[maxn];
int parent[maxn];
int count = 0;
void print(int n) {
for(int i=1; i<n; i++) {
printf("%d ", parent[i]);
}
printf("%d\n", parent[n]);
}
int isPrime(int n) {
if(n<2) {
return 0;
}
for(int i=2; i<=sqrt(n); i++) {
if(n%i==0) {
return 0;
}
}
return 1;
}
void dfs(int n, int value) {
count++;
parent[count] = value;
visit[value] = 1;
if(count==n) {
if(isPrime(parent[1]+value)) {
print(n);
}
} else {
for(int i=1; i<=n; i++) {
if(visit[i]==0 && isPrime(value+i)) {
dfs(n, i);
visit[i] = 0;
count--;
}
}
}
}
int main() {
int n;
int cas = 1;
while(cin>>n) {
printf("Case %d:\n", cas++);
if(n%2==0) {
memset(parent, 0, sizeof(parent));
memset(visit, 0, sizeof(visit));
count = 0;
dfs(n, 1);
}
printf("\n");
}
return 0;
}