P9860 题解
题目大意:给你一个迷宫,其中每个格子可能会有移动方式的限制,求从左上角走到右下角的最少步数。
思路:首先,我们需要排除起点或终点为 * 的情况,此时显然无解,输出 *,则不能进行扩展;如果 |,则只能上下扩展,即只能走到横坐标为 -,则只能左右扩展,即只能走到横坐标为 +,则上下左右都可以扩展,即可以走到横坐标为
参考代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,m;
char a[22][22];
int f[22][22];
queue<pair<int,int>> q;
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
bool bj(int x,int y){return x>=1 && x<=n && y>=1 && y<=m;}
void bfs(){
memset(f,-1,sizeof(f));
f[1][1]=1;
q.push({1,1});
while(!q.empty()){
int x=q.front().first;
int y=q.front().second;
q.pop();
int i,j;
if(a[x][y]=='|') i=0,j=2;
if(a[x][y]=='-') i=2,j=4;
if(a[x][y]=='+') i=0,j=4;
if(a[x][y]=='*') continue;
for(;i<j;i++){
int nx=x+dir[i][0];
int ny=y+dir[i][1];
if(bj(nx,ny) && f[nx][ny]==-1){
f[nx][ny]=f[x][y]+1;
q.push({nx,ny});
}
}
}
return;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%s",a[i]+1);
if(a[1][1]=='*' || a[n][m]=='*'){
printf("-1\n");
continue;
}
bfs();
printf("%d\n",f[n][m]);
}
return 0;
}