原题链接:迷宫问题
解题思路:
注意事项:
刚开始一直得到-1的结果TT 原来是下面这段代码的问题 这里要写!='#' 而不是=='-'
if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&dis[nx][ny]==-1&&grid[nx][ny]!='#')
迷宫问题模板如下:
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
queue<pair<int,int>> q;
int grid[1000][1000];
int dis[1000][1000];
//bfs
int bfs(int startx,int starty,int endx,int endy){
q.push({startx,starty});
memset(dis,-1,sizeof(dis)); //-1看是否被访问过
dis[startx][starty]=0;
while(!q.empty()){
int x=q.front().first;
int y=q.front().second;
q.pop();
//看看当前位置是不是出口,如果是出口就结束
if(x==endx&&y==endy) return dis[x][y];
//不是出口遍历四个方向
for(int k=0;k<4;k++){
//新的x和y坐标
int nx=x+dx[k];
int ny=y+dy[k];
//判断该坐标是否在该地图内/是否被访问过/是否是通路
if(nx>=1&&nx<=m&&ny>=1&&ny<=n&&dis[nx][ny]==-1&&grid[nx][ny]==0){
dis[nx][ny]=dis[x][y]+1;
q.push({nx,ny}); //该坐标可走,放到队列里面去
}
}
}如果是要打印路径:
在 BFS 过程中,可以通过栈来模拟从目标节点回溯到起始节点的过程,这样就可以避免使用额外的二维数组来记录每个节点的前驱节点
void printpath(int startx,int starty,int endx,int endy){
sack<pair<int,int>> path; //只知道从后往前的路径
int curx=endx,cury=endy; //当前位置
while(curx!=startx||cury!=starty){
path.push({curx,cury});
//找到当前节点的前一个结点
for(int k=0;k<4;k++){
int nx=curx+dx[k];
int ny=cury+dy[k];
if(nx>=1&&nx<=m&&ny>=1&&ny<=n&&dis[nx][ny]==dis[curx][cury]-1){
curx=nx;
cury=ny;
break; //dis[nx][ny]==dis[curx][cury]-1 找到了上一步
}
}
}
//最后把起始点也放到栈里
path.push({startx,starty});
//输出路径
while(!path.empty()){
auto p=path.top();
path.pop();
cout<<"("<<p.first<<","<<p.second<<")"<<endl;
}
}参考代码:
#include<bits/stdc++.h>
using namespace std;
int n,m;
char grid[1000][1000];
int dis[1000][1000];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
queue<pair<int,int>> q;
int bfs(int sx,int sy,int ex,int ey){
memset(dis,-1,sizeof(dis));
q.push({sx,sy});
dis[sx][sy]=0;
while(!q.empty()){
int x=q.front().first;
int y=q.front().second;
q.pop();
if(x==ex&&y==ey) {
return dis[x][y];
}
for(int k=0;k<4;k++){
int nx=x+dx[k];
int ny=y+dy[k];
if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&dis[nx][ny]==-1&&grid[nx][ny]!='#'){
dis[nx][ny]=dis[x][y]+1;
q.push({nx,ny});
}
}
}
return -1;
}
int main()
{
int T;
while(cin>>T){
while(T--){
cin>>n>>m;
int sx,sy,ex,ey;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>grid[i][j];
if(grid[i][j]=='S') {
sx=i;
sy=j;
}
if(grid[i][j]=='E'){
ex=i;
ey=j;
}
}
}
int res= bfs(sx,sy,ex,ey);
cout<<res<<endl;
}
}
return 0;
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复