简单地理解广度优先搜索

还是小明找出口的问题,最开始小明在入口(1,1)处,一步可以到达的点有(1,2)和(2,1),如下:

但是出口并不在这两个点上,那么小明只能通过(1,2)和(2,1)这两个点继续往下走,比如现在小明走到了(1,2)这个点,之后他又能到达那些点呢?有(2,2)再看看通过(2,1)又可以到达哪些点呢?可以到达(2,2)和(3,1),此时也许发现(2,2)这个点既可以从(1,2)到达,也可以从(2,1)到达,并且都只使用了2步,为了防止一个点多次被走到,这里需要一个数组来记录一个点是否已经被走到过。

此时小明2步就可以走到的点就全部走到了,有(2,2)和(3,1),可是小明并不在这两个点上,没有别的办法,还得继续往下尝试,在看看通过(2,2)和(3,1)这两个点还能到达哪些没有走到过的点。通过(2,2)这个点我们可以到达(2,3)和(3,2),通过(3,1)可以到达(3,2)和(4,1),现在3步可以到达的点有(2,3),(3,2)和(4,1)依旧没有到达终点,因此重复以上办法,直到到达终点为止。

见下例:

输入:5 4

0 0 1 0

0 0 0 0

0 0 1 0

0 1 0 0

0 0 0 1

1 1 4 3

运行结果: 7

样例说明:输入第一个数n表示迷宫的行,m表示迷宫的列,接下来n行m列为迷宫,0表示空地,1表示障碍物,最后一行四个数前两个表示入口,后两个表示出口,输出最短的步长。

# include <iostream>
# include <string.h>
# include <queue>
using namespace std;
struct node {
    int x;
    int y;
    int length;
    int f_x;
    int f_y;
    node(int x1,int y1,int length1,int f_x1,int f_y1):x(x1),y(y1),length(length1),f_x(f_x1),f_y(f_y1){}
};
int main(){
    freopen("xx.txt","r",stdin);
    int a[101][101];
    queue<node>s;
    int begin_x,begin_y,end_x,end_y,min=999;
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
        }
    }
    cin>>begin_x>>begin_y;
    cin>>end_x>>end_y;
    node *re= node(begin_x,begin_y,0,0,0);
    s.push(*re);
    while(s.empty()==false){
        int fangxiang[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
        for(int i=0;i<=3;i++){
          int x=s.front().x+fangxiang[i][0];
          int y=s.front().y+fangxiang[i][1];
        if(x<1||x>n||y<1||y>m)
          continue;    
        if(a[x][y]==0){
        node *re=new node(x,y,s.front().length+1,s.front().x,s.front().y); 
        s.push(*re);
        a[x][y]=1;    
        if(x==end_x&&y==end_y)
        {
              if(min>(s.front().length+1)){
                  min=s.front().length+1;         
            }    
        }        
        }    
    }
        s.pop();
    }
    cout<<min<<endl;
    return 0;   
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值