广搜

搜索

深搜是一条路挖到底,再退回来继续挖

广搜是一层一层,每个都进行考虑,这里也就用到了一个数据模型:队列。碰到一个情况,就把它塞到队列里等待处理。

 

我们把搜索比作一棵树,那么深搜就是从树根直接搜到叶子,再退回树枝看看有没有其他叶子,没有了就退回到树干,看看有没有其他树枝,这样就搜完了所有的叶子(结果)

广搜就是把树干上所有树枝都放到队列,一个一个取出树枝,查看树枝上的叶子,最后看完所有的叶子

 

所有对于广搜来说,最重要的就是怎么完整的从一个树干上找完所有的树枝,也就是你从队列里取出来这个数据,怎么把它迭代成新的数据存入队列

 

 

例题:

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;
}

 

posted @ 2023-01-06 23:32  小霜降  阅读(49)  评论(0编辑  收藏  举报