BFS_走迷宫_离开中山路

前言:废话不多说,直接开整

1.走迷宫

#include <bits/stdc++.h>//记不住头文件就用它
//犯错误点3:替换的文本在后面
#define x1 first
#define y1 second
using namespace std;
const int N=110;
typedef pair<int,int> PII;
int n,m;
int a,b,c,d;//(a,b)为入口 (c,d)为出口
int g[N][N];
int res;
int dist[N][N];//存储点(x,y)到起始点的距离
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};//上右下左
queue<PII>q;//存坐标
int bfs(int x,int y){
  q.push({x,y});//压入队列
  //犯错点1:sizeof求数组占用的字节
  memset(dist,-1,sizeof(dist));
  // 遗忘的地方 起始点到自己的距离为0
  dist[x][y]=0;

  while(!q.empty()){
    //犯错点2:先取队头再弹出 犯错点4:front后面有括号
    auto t=q.front();
    q.pop();//弹出
    for(int i=0;i<4;i++){
      int x2=t.x1+dx[i],y2=t.y1+dy[i];
      //犯错点5:不要弄混字母
      if(x2<1||x2>n||y2<1||y2>m)continue;//越界
      if(g[x2][y2]!=1)continue;//如果没有道路可走
      if(dist[x2][y2]>0)continue;//走过的路就不再走了
      q.push({x2,y2});//可以走 就把该坐标压入队列
      dist[x2][y2]=dist[t.x1][t.y1]+1;//距离加1
      if(x2==c&&y2==d)return dist[c][d];//提前到达了目的地
    }
  }
  return dist[c][d];
}
int main()
{
  //犯错点6:句尾加分号结尾
  scanf("%d %d",&n,&m);
  for(int i=1;i<=n;i++){
    for(int j=1;j<=m;j++){
      //犯错点7:使用scanf函数 数组元素赋值时&不要忘了
      scanf("%d",&g[i][j]);
    }
  }
  //犯错点8:注意读题 入口和出口题目有要求
  scanf("%d %d %d %d",&a,&b,&c,&d);
  res=bfs(a,b);
  printf("%d",res);
  return 0;
}

蓝桥杯题库跳转

2.离开中山路

#include<bits/stdc++.h>

#define x first
#define y second

using namespace std;

const int N=1010;

typedef pair<int,int> PII;//坐标

int n;
int a,b,c,d;//(a,b)起点 (c,d)终点
int res;
char g[N][N];//地图
int dist[N][N];//距离数组

queue<PII>q;//存坐标的数组

int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};//方向数组

int bfs(int x1,int y1){
    memset(dist,-1,sizeof(dist));
    q.push({x1,y1});
    dist[x1][y1]=0;
    
    while(!q.empty()){
    	//犯错点3:在for循环外先取再弹出 
        PII t=q.front();//取队头
        q.pop();
        for(int i=0;i<4;i++){
            
            int x2=t.x+dx[i],y2=t.y+dy[i];
			//犯错点2:注意临界条件 
            if(x2<0||x2>=n||y2<0||y2>=n)continue;//越界
            if(g[x2][y2]!='0')continue;//不能走
           
            if(dist[x2][y2]>0)continue;//走过了
            
            
            //printf("%c ",g[x2][y2]);
            q.push({x2,y2});
            //犯错点4:在原来坐标的基础上距离加1 
            dist[x2][y2]=dist[t.x][t.y]+1;
            if(x2==(c-1)&&y2==(d-1))return dist[c-1][d-1];//提前到了终点
        }
    }
    return dist[c-1][d-1];
    
}

int main(){
	//犯错点1:少了& 
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%s",g[i]);
    }
    scanf("%d %d %d %d",&a,&b,&c,&d);
    res=bfs(a-1,b-1);
    printf("%d",res);
    return 0;
}

 反思:这道题跟走迷宫的思路基本一样,不一样的就是这道题可能没你想象的那么简单。对于我来说说,差点就留在了中山路。必须得吐槽一下好吧,除了代码注释中所犯的错误以外。还有两点给大家解释一下,一个是地图的读入,看着是全是整型数据对吧,呵呵,当你用走迷宫的办法读入地图时,就会发现有问题,它会把001当作1读入地图,也就是原本的三个点,TM直接变成了一个点,题目其实也注明了,两个数之间没有空格!!!而走迷宫的地图的每个点之间是有空格隔开的,如果按照走迷宫那样读入地图明显是会出错的。那怎么办呢?当时是用字符数组读入地图,这样就可以实现把每个点分开的目的。第二个点就是,地图在二维数组中需不需要在地图外设置一个围栏,走迷宫是直接按照题意存储地图时从二维数组[1][1]开始,符合逻辑。但是离开中山路不行,它要从二维数组的下标[0][0]开始,至于为什么,你可以试试从[1][1]开始存储,如果通过了,那么我从心里佩服你,因为你解决了我的问题。俺就是没解决这个问题,我在调试的过程中发现,如果从[1][1]开始,按照走迷宫一样的套路会导致数组变得很乱,都不理解它咋走的,或者说它会出乎你的意料之外。我就是卡了好久好久,最后干脆从[0][0]存,这样起始位置和终点位置的下标都要减一,在BFS搜索的条件也要做相应的改变,这个都是小问题。总之,知道从数组的[0][0]开始存,其他的都好改。好了,就到这里,拜拜~~~

洛谷题库跳转

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值