DFS1
#include<iostream>
using namespace std;
int n, pre;
int vis[23];
int p[23];
int cnt;
int kcase;
bool isPrime(int num){
for(int i = 2; i*i <= num; ++i){
if(num%i == 0)
return false;
}
return true;
}
void dfs(int cur, int pre, int s){
if(!isPrime(cur+pre))
return;
if(s == n && isPrime(cur+1)){
int flag = 1;
for(int i = 0; i < n; ++i){
if(flag){
cout << p[i];
flag = 0;
}
else{
cout <<" "<<p[i];
}
}
cout <<endl;
return ;
}
for(int i = 1; i <= n; ++i){
if(!vis[i]){
vis[i] = 1;
p[s] = i;
dfs(i, cur, s+1);
vis[i] = 0;
}
}
}
int main()
{
// freopen("C:\\Users\\zhangwei\\Desktop\\in.txt","w",stdout);
while(scanf("%d",&n)!=EOF){
vis[1] = 1;
p[0] = 1;
printf("Case %d:\n",++kcase);
dfs(1,0,1);
printf("\n");
}
return 0;
}
采用数组 记录 类似八皇后处理 正确性是基于 p数组 随着深度变化 不断被改变
DFS2
void dfs(int s){
if(s == n && isPrime(p[s-1]+1)){
int flag = 1;
for(int i = 0; i < s; ++i){
if(flag){
cout << p[i];
flag = 0;
}
else{
cout <<" "<<p[i];
}
}
cout <<endl;
return ;
}
for(int i = 2; i <= n; ++i){
if(!vis[i]){
if(isPrime(p[s-1]+i)){
vis[i] = 1;
p[s++] = i;//这里注意 必须先s++ 不可以 p[s] 后 dfs (s+1)
dfs(s);
vis[i] = 0;
--s;
}
}
}
}
第二种DFS一定注意 s++ 位置 如果采用dfs(s+1)则 当s+1 == n时候 s == n-1 此时回退到起点 s将退为0 而不是1