链接:https://ac.nowcoder.com/acm/problem/15552
来源:牛客网
题目描述
给你一个n*m的图,地图上'.'代表可以走的地方,而'#'代表陷阱不能走,
'P'代表人物位置,'K'代表钥匙,'E'代表出口。人物一个,钥匙有多个,
('K'的数量<=50)),出口一个,每个位置可以向(上,下,左,右)四个
方向走一格,花费一个单位时间,现在你需要花费最少的时间拿到钥匙
然后从迷宫的出口出去(若没有钥匙,则不能进入迷宫出口所在的格子)。
输入描述:
第一行一个整数T(T <= 50),代表数据的组数
接下来一行n,m(n<=500,m<=500),代表地图的行和列
接下来n行,每行一个长度为m的字符串,组成一个图。
输出描述:
如果可以出去,输出所花费的最少时间。
如果不能出去,输出一行"No solution"。
示例1
输入
复制
3
5 5
....P
##..E
K#...
##...
.....
5 5
P....
.....
..E..
.....
....K
5 5
P#..E
.#.#.
.#.#.
.#.#.
...#K
输出
复制
No solution
12
No solution
//就很标准的bfs找最短路,但这个钥匙有很多个,从人物找钥匙,再从出口找钥匙,开个数组存距离,最后min一下
//https://www.acwing.com/video/277/
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=520;
#define ll long long
typedef pair<int,int>PII;
int n,m,pp,ji1,ji2,minn=2550;
int d[N][N],kk[N][N];
char a[N][N];
void bfs1(int star1,int star2)
{
ji1=0;ji2=0;
memset(d,-1,sizeof d);
memset(kk,-1,sizeof kk);
d[star1][star2]=0;
queue<PII>q;
q.push({star1,star2});
int dx[4]={0,-1,0,1},dy[4]={-1,0,1,0};
while(q.size())
{
auto t=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int x=t.first+dx[i],y=t.second+dy[i];
if(x>=0&&x<n&&y>=0&&y<m&&a[x][y]=='.'&&d[x][y]==-1)
{
q.push({x,y});
d[x][y]=d[t.first][t.second]+1;
}
if(x>=0&&x<n&&y>=0&&y<m&&a[x][y]=='K'&&d[x][y]==-1)
{
d[x][y]=d[t.first][t.second]+1;
kk[x][y]=d[x][y];
}
}
}
return ;
}
void bfs2(int ji1,int ji2)
{
minn=2550;
memset(d,-1,sizeof d);
d[ji1][ji2]=0;
queue<PII>q;
q.push({ji1,ji2});
int dx[4]={0,-1,0,1},dy[4]={-1,0,1,0};
while(q.size())
{
auto t=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int x=t.first+dx[i],y=t.second+dy[i];
if(x>=0&&x<n&&y>=0&&y<m&&a[x][y]=='.'&&d[x][y]==-1)
{
q.push({x,y});
d[x][y]=d[t.first][t.second]+1;
}
if(x>=0&&x<n&&y>=0&&y<m&&a[x][y]=='K'&&d[x][y]==-1&&kk[x][y]!=-1)
{
d[x][y]=d[t.first][t.second]+1;
kk[x][y]+=d[x][y];
minn=min(minn,kk[x][y]);
// cout<<minn<<" "<<kk[x][y]<<" "<<x<<" "<<y<<endl;
}
}
}
return ;
}
int main()
{ ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>pp;
while(pp--)
{
cin>>n>>m;
int star1,star2,chu1,chu2;
for(int i=0;i<n;i++)
for(int k=0;k<m;k++)
{
cin>>a[i][k];
if(a[i][k]=='P')
{
star1=i;star2=k;
}
if(a[i][k]=='E') chu1=i,chu2=k;
}
bfs1(star1,star2);
bfs2(chu1,chu2);
if(minn==2550)
{
cout<<"No solution"<<endl;
continue;
}
cout<<minn<<endl;
}
return 0;
}
京公网安备 11010502036488号