BFS迷宫最短路

链接:https://ac.nowcoder.com/acm/contest/76609/D
来源:牛客网

小红来到了一个 $n * m $ 的矩阵,她初始站在左上角,每次行走可以按“上下左右”中的一个方向走一步,但必须走到和当前格子不同的字符,也不能走到矩阵外。

小红想知道,从左上角走到右下角最少需要走多少步?
输入描述:
第一行输入两个正整数\(n,m\)用空格隔开。代表矩阵的行数和列数。
接下来的\(n\)行,每行输入一个长度为\(m\)的、仅由小写字母组成的字符串,用来表示矩阵。
\(1\leq n,m \leq1000\)
输出描述:
如果无法到达右下角,则输出-1。
否则输出一个整数,代表行走的最小步数。

示例1
输入
3 4
abbc
accd
bcee
输出
9
说明
image

#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=1e3+100;
int dx[4]={0,0,-1,1};
int dy[4]={1,-1,0,0};
int n,m;
struct node{
	int x;
	int y;
	int st;
};
int vis[maxn][maxn];
char a[maxn][maxn];
int BFS(){
	queue<node>q;
	q.push({1,1,0});
	vis[1][1]=1;
	while(q.size()){
		node now=q.front();
		if(now.x==n&&now.y==m){
			return now.st;
		}
		q.pop();
		for(int i=0;i<4;i++){
			int xx=dx[i]+now.x;
			int yy=dy[i]+now.y;
			if(!vis[xx][yy]&&xx>=1&&xx<=n&&yy>=1&&yy<=m&&a[now.x][now.y]!=a[xx][yy]){
				q.push({xx,yy,now.st+1});
				vis[xx][yy]=1;
			}
		}
	}
	return -1;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		scanf("%s",a[i]+1);
	}
	cout<<BFS()<<endl;
}
posted @ 2024-03-13 10:49  lipu123  阅读(13)  评论(0)    收藏  举报