广搜
搜索
深搜是一条路挖到底,再退回来继续挖
广搜是一层一层,每个都进行考虑,这里也就用到了一个数据模型:队列。碰到一个情况,就把它塞到队列里等待处理。
我们把搜索比作一棵树,那么深搜就是从树根直接搜到叶子,再退回树枝看看有没有其他叶子,没有了就退回到树干,看看有没有其他树枝,这样就搜完了所有的叶子(结果)
广搜就是把树干上所有树枝都放到队列,一个一个取出树枝,查看树枝上的叶子,最后看完所有的叶子
所有对于广搜来说,最重要的就是怎么完整的从一个树干上找完所有的树枝,也就是你从队列里取出来这个数据,怎么把它迭代成新的数据存入队列
例题:
P2802 回家(打烦了,直接爆搜,不加判断条件(可能会往回搜,但由于是按时间来搜索的,所以只要找到答案就可以直接输出),所以加了一个顶点,不然搜不到答案会一直搜索,队列会炸)
#include <bits/stdc++.h> using namespace std; int a[10][10]; struct node{ int x,y,xl,t; };//x,y坐标 xl,血量 t,时间 node s,s1; queue<node> Q; int main() { int n,m,ans=-1; cin>>n>>m; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ cin>>a[i][j]; if(a[i][j]==2){s.x =i,s.y =j,s.xl =6,s.t =0; Q.push(s); } } int h=0,t=1; while(h!=t) { s=Q.front(); Q.pop(); h++; if(s.xl ==0) continue;//如果血量为0,不循环 if(a[s.x ][s.y ]==4) s.xl =6;//鼠标点,血量恢复 if(t==1000000) break;//停止搜索 if(a[s.x ][s.y ]==3) {ans=s.t ; break;}//找到答案 if(s.x >=2 && a[s.x -1][s.y ]!=0)//如果不是边界和障碍点就搜索 { s1=s; s1.x -=1; s1.t +=1; s1.xl -=1;//时间加1,血量-1 Q.push(s1); t++; } if(s.x <n && a[s.x +1][s.y ]!=0) { s1=s; s1.x +=1; s1.t +=1; s1.xl -=1; Q.push(s1); t++; } if(s.y >=2 && a[s.x ][s.y -1]!=0) { s1=s; s1.y -=1; s1.t +=1; s1.xl -=1; Q.push(s1); t++; } if(s.y <m && a[s.x ][s.y +1]!=0) { s1=s; s1.y +=1; s1.t +=1; s1.xl -=1; Q.push(s1); t++; } } cout<<ans; return 0; }