您的位置:首页 > 其它

HDU 2612 Find a way题解

2015-10-23 09:50 344 查看
题目大意:Y和M要去同一个kfc相聚,求最短路径。

分析:简单的bfs,运用两次bfs便可求出。我这里用了两个数组来保存各自到达的时间。上代码

#include <stdio.h>
#include <string.h>

struct pep
{
int x, y;
};

const int inf = 0x013f3f33;
char map[205][205];
int map1[40050], map2[40050];
int kfc[40050];
int len[40050];
int dx[] = { 0, 0, -1, 1 };
int dy[] = { -1, 1, 0, 0 };
struct pep queue[40050];
bool v[205][205];
int m, n, index;

int bfs(int flag)
{
int front = 0, rear = 1;
while (front < rear)
{
struct pep& p = queue[front];
for (int d = 0; d < 4; d++)
{
int nx = p.x + dx[d];
int ny = p.y + dy[d];
if (nx >= 0 && nx < m&&ny >= 0 && ny < n)
{
if (map[nx][ny] != '#'&&!v[nx][ny])
{
v[nx][ny] = true;
if (map[nx][ny] == '@')
{
if (flag)
map1[nx*m + ny] = len[front] + 1;
else
map2[nx*m + ny] = len[front] + 1;
}
queue[rear].x = nx;
queue[rear].y = ny;
len[rear] = len[front] + 1;
rear++;
}
}
}
front++;
}
return 0;
}

int main()
{
while (scanf("%d%d", &m, &n) != EOF)
{
memset(map1, 0, sizeof(map1));
index = 0;
for (int i = 0; i < m; i++)
scanf("%s", map[i]);
int tagi, tagj;
memset(v, false, sizeof(v));
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (map[i][j] == '@')
{
kfc[index] = i*m + j;
index++;
map1[i*m + j] = inf;
map2[i*m + j] = inf;
}
if (map[i][j] == 'Y')
{
queue[0].x = i;
queue[0].y = j;
len[0] = 0;
v[i][j] = true;
}
if (map[i][j] == 'M')
{
tagi = i;
tagj = j;
}
}
}
bfs(0);
memset(v, false, sizeof(v));
queue[0].x = tagi;
queue[0].y = tagj;
v[tagi][tagj] = true;
bfs(1);
int min = inf;
for (int i = 0; i < index; i++)
{
int k = kfc[i];
int sum = map1[k] + map2[k];
if (sum < min)
min = sum;
}
printf("%d\n", min * 11);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: