一道简单的广度优先搜索题。请多多指教!
题目大意:在题目给的迷宫,每个格子都可能会有移动限制,求从左上角走到右下角的最少步数
这里我们可以用广搜,只不过这里的广搜需要遵循格子的移动限制,然后就可以用广搜的模板了。
参考代码如下:
代码:
#include<bits/stdc++.h>
using namespace std;
char a[21][21];
int t,r,c;
int ans[21][21];
bool vis[21][21];
int bfs(){
for(int i=0;i<r;++i){
for(int j=0;j<c;++j){
ans[i][j]=1000;
vis[i][j]=false;
}
}
ans[0][0]=1,vis[0][0]=true;
queue<int>q;
q.push(0);
while(!q.empty()){
int f=q.front();
int x=f/100,y=f%100;
char k=a[x][y];
if(k=='+'){
int nx,ny;
nx=x-1,ny=y;
if(!(nx<0||a[nx][ny]=='*'||vis[nx][ny])){
ans[nx][ny]=ans[x][y]+1;
q.push(nx*100+ny);
vis[nx][ny]=true;
}
nx=x,ny=y-1;
if(!(ny<0||a[nx][ny]=='*'||vis[nx][ny])){
ans[nx][ny]=ans[x][y]+1;
q.push(nx*100+ny);
vis[nx][ny]=true;
}
nx=x+1,ny=y;
if(!(nx>=r||a[nx][ny]=='*'||vis[nx][ny])){
ans[nx][ny]=ans[x][y]+1;
q.push(nx*100+ny);
vis[nx][ny]=true;
}
nx=x,ny=y+1;
if(!(ny>=c||a[nx][ny]=='*'||vis[nx][ny])){
ans[nx][ny]=ans[x][y]+1;
q.push(nx*100+ny);
vis[nx][ny]=true;
}
}
if(k=='-'){
int nx,ny;
nx=x,ny=y-1;
if(!(ny<0||a[nx][ny]=='*'||vis[nx][ny])){
ans[nx][ny]=ans[x][y]+1;
q.push(nx*100+ny);
vis[nx][ny]=true;
}
nx=x,ny=y+1;
if(!(ny>=c||a[nx][ny]=='*'||vis[nx][ny])){
ans[nx][ny]=ans[x][y]+1;
q.push(nx*100+ny);
vis[nx][ny]=true;
}
}
if(k=='|'){
int nx,ny;
nx=x-1,ny=y;
if(!(nx<0||a[nx][ny]=='*'||vis[nx][ny])){
ans[nx][ny]=ans[x][y]+1;
q.push(nx*100+ny);
vis[nx][ny]=true;
}
nx=x+1,ny=y;
if(!(nx>=r||a[nx][ny]=='*'||vis[nx][ny])){
ans[nx][ny]=ans[x][y]+1;
q.push(nx*100+ny);
vis[nx][ny]=true;
}
}
q.pop();
}
if(ans[r-1][c-1]==1000)return -1;
return ans[r-1][c-1];
}
int main(){
cin>>t;
while(t--){
cin>>r>>c;
for(int i=0;i<r;++i){
cin>>a[i];
}
cout<<bfs()<<endl;
}
return 0;
}