http://acm.hdu.edu.cn/showproblem.php?pid=2612
题意 : Y和M去同一个KFC的时间最短(KFC可能有多个)
我的方法是从KFC开始搜索到两个人的最短时间之和。唯一蛋疼的是一开始TLE了几把。伤啊。
/*
* Danceonly
*/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
#define MAX(a,b) (a > b ? a : b)
#define MIN(a,b) (a < b ? a : b)
const int maxn = 10000007;
struct node
{
int x;
int y;
}kfc[100005];
struct abc
{
int x,y;
int step;
}q[100005],e;
int maze[205][205],vis[205][205];
int dir[4][2] = {1,0,0,1,-1,0,0,-1};
int N,M;
int BFS(int sx,int sy,int A)
{
int tail,head,step,x,y;
head = tail = 0;
q[head].x = sx;
q[head].y = sy;
q[head].step = 0;
vis[sx][sy] = 1;
while (head <= tail)
{
x = q[head].x;
y = q[head].y;
step = q[head].step;
for (int i=0;i<4;i++)
{
e.x = x + dir[i][0];
e.y = y + dir[i][1];
if (maze[e.x][e.y] == 0 || vis[e.x][e.y])continue ;
e.step = step + 1;
vis[e.x][e.y] = 1;
if (maze[e.x][e.y] == A)
{
return e.step;
}
q[++tail] = e;
}
head++;
}
return maxn;
}
void show()
{
for (int i=1;i<=N;i++)
{
for (int j=1;j<=M;j++)
printf("%d ",maze[i][j]);
printf("\n");
}
}
void init()
{
memset(vis,0,sizeof(vis));
memset(maze,0,sizeof(maze));
return ;
}
int main()
{
while (scanf("%d%d",&N,&M) == 2)
{
int Yx,Yy,Mx,My;
memset(maze,0,sizeof(maze));
int c = 0;
for (int i=1;i<=N;i++)
{
char ss[1005];
scanf("%s",ss);
for (int j=0;j<M;j++)
if (ss[j] == '.')maze[i][j+1] = 1;
else if (ss[j] == '@'){kfc[c].x = i;kfc[c++].y = j + 1;maze[i][j+1] = 1;}
else if (ss[j] == 'Y'){maze[i][j+1] = 2;Yx = i;Yy = j + 1;}
else if (ss[j] == 'M'){maze[i][j+1] = 3;Mx = i;My = j + 1;}
}
//show();
int ans = maxn;
for (int i=0;i<c;i++)
{
int sum = 0;
memset(vis,0,sizeof(vis));
sum += BFS(kfc[i].x,kfc[i].y,2);
if (sum + abs(kfc[i].x - Mx) + abs(kfc[i].y-My) >= ans)
continue ;
memset(vis,0,sizeof(vis));
sum += BFS(kfc[i].x,kfc[i].y,3);
if (ans > sum)ans = sum;
}
printf("%d\n",ans * 11);
}
return 0;
}
/*
4 4
Y.#@
....
.#..
@..M
4 4
Y.#@
....
.#..
@#.M
5 5
Y..@.
.#...
.#...
@..M.
#...#
*/