前言:废话不多说,直接开整
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]开始存,其他的都好改。好了,就到这里,拜拜~~~