acwing.走迷宫(bfs)

bfs+记录层数(利用一个数组记录到达maze[i][j]所需要走的路径(layer[i][j]=来处+1),因为每个点只经过一次,所以layer[i][j]记录的一定是最短的路径长度)

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;

int n,m;
int maze[110][110];
int layer[110][110];//存储到达某点的最短路径长度,一旦杯赋值,就一定是到达这个点的最短路径长度
queue<pair<int,int>> que;
int fx[4][2]={{0,1},{0,-1},{1,0},{-1,0}};

int bfs(int x,int y){
	que.push({x,y});
	maze[x][y]=1;
	layer[x][y]=0;
	while(!que.empty()){
		auto t=que.front();
		que.pop();
		for(int i=0;i<4;i++){
			int a=t.first+fx[i][0],b=t.second+fx[i][1];
			if(maze[a][b]==0&&(a<=n&&a>0)&&(b<=m&&b>0)){
				que.push({a,b});
				layer[a][b]=layer[t.first][t.second]+1;
				maze[a][b]=1;
			}
		}
	}
	return layer[n][m];
}

int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>maze[i][j];
		}
	}
	cout<<bfs(1,1);
	return 0;
}

拓展:求路径(开一个数组记录一下每个点是从哪个点过来的) 不能记录每个点的后一个点,因为一个点可能有多个可选路径,而一个点只会有一个前点。

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;

int n,m;
int maze[110][110];
int layer[110][110];//存储到达某点的最短路径长度,一旦杯赋值,就一定是到达这个点的最短路径长度
pair<int,int> previ[110][110];
queue<pair<int,int>> que;
int fx[4][2]={{0,1},{0,-1},{1,0},{-1,0}};

int bfs(int x,int y){
	que.push({x,y});
	maze[x][y]=1;
	layer[x][y]=0;
	while(!que.empty()){
		auto t=que.front();
		que.pop();
		for(int i=0;i<4;i++){
			int a=t.first+fx[i][0],b=t.second+fx[i][1];
			if(maze[a][b]==0&&(a<=n&&a>0)&&(b<=m&&b>0)){
			    previ[a][b]=t;
				que.push({a,b});
				layer[a][b]=layer[t.first][t.second]+1;
				maze[a][b]=1;
			}
		}
	}
	int a=n,b=m;
	while(a!=1||b!=1){
	    cout<<a<<" "<<b;
	    auto t=previ[a][b];
	    a=t.first;
	    b=t.second;
	}
	return layer[n][m];
}

int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>maze[i][j];
		}
	}
	cout<<bfs(1,1);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值