题目链接
题意
这个迷宫有N*M个房间,迷宫的入口为(1,1),物品在(r,c)。迷宫中的房间有四种状态:空房间、无法进入的房间、有墨菲斯托存在的房间和有莉莉丝存在的房间。路线上不能同时经过后面的两种房间。每步可以从他当前的房间走至上下左右四个房间的其中一个房间。问最少需要走多少步可以从入口出发取回算法书并逃离迷宫?
思路
- 走迷宫改编版,空房间和M或者F的房间可以走,即一次路径中不能同时有M和F,两边bfs即可,第一次走空房间和F,第二次走空房间和M,取最短路径
参考代码
#include<bits/stdc++.h>
using namespace std;
char aa[1010][1010];
int vis[1010][1010];
int yd[4][2]= {{1,0},{-1,0},{0,1},{0,-1}};
int sx,sy;
struct node
{
int x,y,bs;
node(int _x = 0, int _y = 0, int _bs = 0): x(_x), y(_y), bs(_bs) {}
};
queue<node>q;
int main()
{
int n,m,r,c;
int t;
cin>>t;
while(t--)
{
cin>>n>>m>>r>>c;
while(!q.empty())
q.pop();
memset(vis,0,sizeof(vis));
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
cin>>aa[i][j];
}
}
vis[sx][sy]=1;
q.push(node(1, 1, 0));
int ans=-1;
while(!q.empty())
{
node tmp=q.front();
q.pop();
if(tmp.x==r&&tmp.y==c)
{
ans=tmp.bs;
break;
}
for(int i=0; i<4; i++)
{
int x=tmp.x+yd[i][0];
int y=tmp.y+yd[i][1];
if(x>=1&&x<=n&&y>=1&&y<=m&&vis[x][y]==0&&(aa[x][y]=='.'||aa[x][y]=='F'))
{
vis[x][y]=1;
q.push(node(x, y, tmp.bs+1));
}
}
}
memset(vis,0,sizeof(vis));
while(!q.empty())
q.pop();
vis[sx][sy]=1;
q.push(node(1, 1, 0));
while(!q.empty())
{
node tmp=q.front();
q.pop();
if(tmp.x==r&&tmp.y==c)
{
if(ans==-1)
ans=tmp.bs;
else
ans=min(ans,tmp.bs);
break;
}
for(int i=0; i<4; i++)
{
int x=tmp.x+yd[i][0];
int y=tmp.y+yd[i][1];
if(x>=1&&x<=n&&y>=1&&y<=m&&vis[x][y]==0&&(aa[x][y]=='.'||aa[x][y]=='M'))
{
vis[x][y]=1;
q.push(node(x, y, tmp.bs+1));
}
}
}
if(ans==-1)
cout<<"IMPOSSIBLE"<<endl;
else
cout<<ans*2<<endl;
}
}