Find a way
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 24190 Accepted Submission(s): 7911
Yifenfei’s home is at the countryside, but Merceki’s home is in the center of city. So yifenfei made arrangements with Merceki to meet at a KFC. There are many KFC in Ningbo, they want to choose one that let the total time to it be most smallest.
Now give you a Ningbo map, Both yifenfei and Merceki can move up, down ,left, right to the adjacent road by cost 11 minutes.
Each test case include, first two integers n, m. (2<=n,m<=200).
Next n lines, each line included m character.
‘Y’ express yifenfei initial position.
‘M’ express Merceki initial position.
‘#’ forbid road;
‘.’ Road.
‘@’ KCF
4 4
Y.#@
….
.#..
@..M
4 4
Y.#@
….
.#..
@#.M
5 5
Y..@.
.#…
.#…
@..M.
#…#
66
88
66
我认为,M 能及经过 Y ,Y 也能到 M
用BFS寻找
Y or M
Y
o
r
M
到每一个
@
@
的最短距离
然后记录能到达每一个
@
@
的距离,用
cnt1[i][j]
c
n
t
1
[
i
]
[
j
]
来记录,其中,
i,j
i
,
j
,是当前
@
@
的坐标
然后记录能到达每一个 @ @ 的距离,用 cnt2[i][j] c n t 2 [ i ] [ j ] 来记录,其中, i,j i , j ,是当前 @ @ <script type="math/tex" id="MathJax-Element-455">@</script> 的坐标
找到之后遍历整张图
ans=0x3f3f3f3f;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(str[i][j]=='@')
ans=min(ans,cnt1[i][j]+cnt2[i][j]);
CODE:
#include<bits/stdc++.h>
using namespace std;
const int MAXN=222;
char str[MAXN][MAXN];
bool vis[MAXN][MAXN];
int cnt1[MAXN][MAXN];
int cnt2[MAXN][MAXN];
int d[4][2]={1,0, -1,0, 0,1, 0,-1};
int n,m,sx,sy,yx,yy,mx,my;
struct node{
int x,y,step;
node(){};
node(int _x,int _y,int _step)
{
x=_x; y=_y; step=_step;
}
bool operator <(const node &b)const
{
return step>b.step;
}
};
void bfs1(int x,int y)
{
memset(vis,0,sizeof(vis));
memset(cnt1,0x3f,sizeof(cnt1));//需要对其初始化为 INF 因为有可能一个能到,另外一个不能到
vis[x][y]=1;
priority_queue<node> que;
que.push(node(x,y,0));
node e1,e2;
int ans=0;
while(que.size())
{
e1=que.top();
que.pop();
if(str[e1.x][e1.y]=='@')
{
vis[e1.x][e1.y]=1;
cnt1[e1.x][e1.y]=e1.step;//记录 Y 到 @ 的最小距离
}
for(int i=0;i<4;i++)
{
e2.x=e1.x+d[i][0];
e2.y=e1.y+d[i][1];
e2.step=e1.step+1;
if(!vis[e2.x][e2.y] && str[e2.x][e2.y]!='#' && 0 <= e2.x && e2.x <n && 0 <= e2.y && e2.y <m)
{
vis[e2.x][e2.y]=1;
que.push(e2);
}
}
}
}
void bfs2(int x,int y)
{
memset(vis,0,sizeof(vis));
memset(cnt2,0x3f,sizeof(cnt2));
vis[x][y]=1;
priority_queue<node> que;
que.push(node(x,y,0));
node e1,e2;
int ans=0;
while(que.size())
{
e1=que.top();
que.pop();
if(str[e1.x][e1.y]=='@')
{
vis[e1.x][e1.y]=1;
cnt2[e1.x][e1.y]=e1.step;//记录 M 到 @ 的最小距离
}
for(int i=0;i<4;i++)
{
e2.x=e1.x+d[i][0];
e2.y=e1.y+d[i][1];
e2.step=e1.step+1;
if(!vis[e2.x][e2.y] && str[e2.x][e2.y]!='#' && 0 <= e2.x && e2.x <n && 0 <= e2.y && e2.y <m)
{
vis[e2.x][e2.y]=1;
que.push(e2);
}
}
}
}
int main()
{
while(~scanf("%d %d",&n,&m))
{
for(int i=0;i<n;i++) scanf("%s",str[i]);
// for(int i=0;i<n;i++) printf("%s\n",str[i]);
int ans=0x3f3f3f3f;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(str[i][j]=='Y')
bfs1(i,j);
if(str[i][j]=='M')
bfs2(i,j);
}
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(str[i][j]=='@')
ans=min(ans,cnt1[i][j]+cnt2[i][j]);
printf("%d\n",ans*11);
}
return 0;
}