BFS

//给一个地图由起点到点最短步数 .通*不通
//标准广搜模版题
#include<bits/stdc++.h>
using namespace std;
char mp[103][103];          //地图大小
int vis[103][103];          //访问标记
typedef struct point pt;    //点重命名
struct point{int x;int y;}; //点结构体
typedef pair<pt,int> p;     //pair存点与距离,方便队列
int dx[4]={0,0,-1,1};       //X偏移,上下左右
int dy[4]={1,-1,0,0};       //Y偏移,上下左右
int main(){
    int n,m;cin>>n>>m;      //地图大小
    pt s,g;                 //定义起点与终点
    for(int i=1;i<=n;i++){  //遍历行
        for(int j=1;j<=m;j++){  //遍历列
            cin>>mp[i][j];      //输入
            if(mp[i][j]=='s'){  //如果是起点
                s.x=i;      //记下X
                s.y=j;      //记下Y
            }
            if(mp[i][j]=='g'){//如果是终点
                g.x=i;      //记下X
                g.y=j;      //记下Y
            }

        }
    }
    queue<p>qu;             //开队列
    qu.push(p(s,0));        //压入起点
    while(!qu.empty()){     //非空
        pt nowp=qu.front().first;   //读出队首点
        int dis=qu.front().second;  //读出队首点到起点步数
        vis[nowp.x][nowp.y]=1;      //打上已访问标记
        qu.pop();                   //弹出队首
        if(nowp.x==g.x&&nowp.y==g.y){cout<<dis<<endl;return 0;}     //到终点跳出
        for(int i=0;i<4;i++){   //未到终点则四个方向偏移
            pt newp;            //定义新点
            newp.x=nowp.x+dx[i];if(newp.x<1 || newp.x>n)continue;   //得新X,超限跳过
            newp.y=nowp.y+dy[i];if(newp.y<1 || newp.y>m)continue;   //得新Y,超限跳过
            if(vis[newp.x][newp.y]==0&&mp[newp.x][newp.y]!='*'){    //未访问且可行
                qu.push(p(newp,dis+1));                             //新点压入队列
            }
        }
    }
    cout<<"impossible"<<endl;   //队空都走不到,就肯定走不到了
    return 0;
}
/*
in
3 3
s..
...
g..
out
2
in
3 3
s..
**.
g..
out
6
in
3 3
s..
***
g..
out
impossible
*/

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值