#include <stdio.h>
#include <iostream>
#include <cstring>
#include <stdlib.h>
#include <algorithm>
#include <queue>
#include <math.h>
#define MAX 300
#define INF 1e8
using namespace std;
typedef pair<int,int> P;
int N,M;
char maze[MAX][MAX];
int yx,yy;//y的起始坐标
int mx,my;//m的起始坐标
int d1[MAX][MAX],d2[MAX][MAX];
int move1[4] = {1,0,-1,0},move2[4] = {0,1,0,-1};
int ax[40005],ay[40005];
void dfs(int x,int y,int x1,int y1)
{
queue<P> que;
P b;
que.push(P(x,y));
for (int i = 0;i < N;i++)
{
for (int j = 0;j < M;j++)
{
d1[i][j] = INF;
d2[i][j] = INF;
}
}
d1[x][y] = 0;
d2[x1][y1] = 0;
while (!que.empty())
{
b = que.front();
que.pop();
int nx,ny;
for (int i = 0;i < 4;i++)
{
ny = b.second + move1[i];
nx = b.first +move2[i];
if((nx>=0&&nx<N)&&(ny>=0&&ny<M)&&maze[nx][ny]!='#'&&d1[nx][ny]==INF)
{
que.push(P(nx,ny));
d1[nx][ny] = d1[b.first][b.second] + 1;
}
}
}
que.push(P(x1,y1));
while (!que.empty())
{
b = que.front();
que.pop();
int nx,ny;
for (int i = 0;i < 4;i++)
{
ny = b.second + move1[i];
nx = b.first +move2[i];
if((nx>=0&&nx<N)&&(ny>=0&&ny<M)&&maze[nx][ny]!='#'&&d2[nx][ny]==INF)
{
que.push(P(nx,ny));
d2[nx][ny] = d2[b.first][b.second] + 1;
}
}
}
}
int main(void)
{
int k;
int ans;
while(scanf("%d %d",&N,&M) != EOF)
{
if(N==0&&M==0)
{
break;
}
k = 0;
for (int i = 0;i < N;i++)
{
scanf("%s",maze[i]);
}
for (int i = 0;i < N;i++)
{
for (int j = 0;j < M;j++)
{
if(maze[i][j] == 'Y')
yx = i,yy = j;
else if(maze[i][j] == 'M')
mx = i,my = j;
else if(maze[i][j] == '@')
{
ax[k] = i,ay[k] = j;
k++;
}
}
}
dfs(yx,yy,mx,my);
ans = d1[ax[0]][ay[0]] + d2[ax[0]][ay[0]];
for (int i = 1;i < k;i++)
{
ans = min(ans,d1[ax[i]][ay[i]] + d2[ax[i]][ay[i]]);
/*cout<<d2[ay[i]][ax[i]]<<endl;
cout<<d1[ay[i]][ax[i]]<<endl;*/
}
cout<<ans*11<<endl;
}
return 0;
}
宽度优先搜索
最新推荐文章于 2022-06-02 13:37:36 发布