HDU

来源:互联网 发布:淘宝s挂钩 编辑:程序博客网 时间:2024/06/05 00:54

题目大意:Y 和 M 约定在一家 KFC 相见,地图上有许多家 KFC 都用 @ 表示,每移动一格耗时 11 分钟,找一条耗费时间最少的路,并输出两人耗时之和。
解题思路:t 数组记录到达当前位置需要几步,两次 BFS 即可求出两个人到达某个位置的步数和,最后遍历地图,找出所有 @ 对应位置次数和最少的地方,输出时间。
有的 @ 是无法达到的,在 t 中仍是初始化的 0,这要比可达的时间少,但显然是错误的,因此找答案的时候还要判断一下是否为 0

#include<iostream>#include<stdio.h>#include<algorithm>#include<cmath>#include<string.h>#include<string>#include<queue>#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))const int INF = 0x3f3f3f3f;const int NINF = -INF -1;const int MAXN = 200+10;using namespace std;int n, m;char map[MAXN][MAXN];bool vis[MAXN][MAXN];int t[MAXN][MAXN];int dx[] = {-1, 0, 1, 0};int dy[] = {0, -1, 0, 1};struct point {    int x, y, t;};int bfs(int x, int y) {    queue<point> q;    point s, p;    s.x = x;    s.y = y;    s.t = 0;    q.push(s);    vis[s.x][s.y] = 1;    while (!q.empty()) {        s = q.front();        q.pop();//printf("%d %d\n", s.x, s.y);        for (int i = 0; i < 4; i++) {            p.x = s.x + dx[i];            p.y = s.y + dy[i];            p.t = s.t + 1;//printf("--%d %d\n", p.x, p.y);            if (p.x < 0 || p.x >= n || p.y < 0 || p.y >= m) continue;            if (map[p.x][p.y] != '#' && !vis[p.x][p.y]) {                q.push(p);                vis[p.x][p.y] = 1;                t[p.x][p.y] += p.t;            }        }    }}int main() {    while (scanf("%d%d", &n, &m) != EOF) {        getchar();        memset(t, 0, sizeof(t));        for (int i = 0; i < n; i++)            gets(map[i]);        for (int i = 0; i < n; i++)            for (int j = 0; j < m; j++)                if (map[i][j] == 'Y' || map[i][j] == 'M') {                    memset(vis, 0, sizeof(vis));                    bfs(i, j);                }/*for (int i = 0; i < n; i++) {    for (int j = 0; j < m; j++)        printf("%d ", t[i][j]);    printf("\n");}*/        int ans = INF;        for (int i = 0; i < n; i++)            for (int j = 0; j < m; j++)                if (map[i][j] == '@' && t[i][j] != 0)                    ans = min(ans, t[i][j]);        printf("%d\n", ans*11);    }    return 0;}
原创粉丝点击