dfs

dfs(深度优先搜索)即从每一个位置开始,逐步搜索下一个可行解,直到找到答案或者因不合法而返回

常见应用

走迷宫问题(小规模)

可以通过暴力+剪枝解决的问题

 

eg.素数环问题

// 素数环问题 clockwise||anticlockwise 直接搜索
//二维数组不宜用回溯,因为回溯时部分元素会被置为0
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
using namespace std;
int a[22];
bool vis[22];
int n;
int count;

bool isprime(int n){
if(n==1) return 0;
if(n==2||n==3) return 1;
for(int i=2;i<=sqrt(n);i++){
if(n%i==0) return 0;
}
return 1;
}

void dfs(int now,int cnt){ //两个变量:当前要填的数和填了多少个数
if(!vis[now]){
if(isprime(now+a[cnt])){
vis[now]=1;
a[cnt+1]=now;
if(cnt+1==n){
if(isprime(a[1]+a[n])){
for(int i=1;i<=n;i++){
if(i<n) printf("%d ",a[i]);
else printf("%d\n",a[i]);
}
}
// return;
}
for(int i=2;i<=n;i++){
if(!vis[i]) dfs(i,cnt+1);
}
vis[now]=0;
a[cnt+1]=0;
}
}
else{
for(int i=2;i<=n;i++){
if(!vis[i]){
dfs(i,cnt);
}
}
}
}

int main(){
// freopen("data.in.txt","r",stdin); //.txt是文件拓展名 必须写
// freopen("data.out.txt","w",stdout);
while(scanf("%d",&n)==1){
count++;
printf("Case %d:\n",count);
memset(a,0,sizeof(a));
memset(vis,0,sizeof(vis));
a[1]=1;vis[1]=1;
for(int i=2;i<=n;i++) dfs(i,1);
// printf("Time used = %.2f\n",(double)clock()/CLOCKS_PER_SEC);
puts("");
}
return 0;
}

posted @ 2021-03-28 13:28  starlightlmy  阅读(409)  评论(0)    收藏  举报