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
说明
#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;
}