zoukankan      html  css  js  c++  java
  • xdoj 1402 XY之说走就走的旅行

    1412: XY之说走就走的旅行

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 903  解决: 128
    [提交][状态][讨论版]

    题目描述

    X和Y是好基友,他们决定进行一次说走就走的旅行,因此俩人约好在车站会合。 

    城市中有多个车站,为了节省时间,他们约好的车站应该离双方的家都比较近。 

    即若X与车站i距离为dXi,Y与车站i距离为dYi,则该车站为max(dXi,dYi)最小的车站。(只有‘#’的位置无法通过)

    输入

    多组数据,请处理到文件尾。 

    对于每组数据: 

    第一行含有两个正整数n,m

    接下来是一个n行m列的矩阵,表示城市地图,矩阵中任意元素只和上下左右元素(如果存在且可达)相邻,相邻元素之间距离为1。 

    其中” . ”代表可走的街道,” # ”代表不可走的街道,” P ”表示车站,” X ”代表X的家,” Y ”代表Y的家。

    输出

    对于每组数据输出一行,含有两个整数x,y,以空格分隔,代表约定好的车站所在的行号和列号(1<=x<=n,1<=y<=m)。 

    若存在多个满足条件的解,则答案应为行号最小的;若还存在多个解,则答案应应为列号最小的。 

    保证解一定存在。

    样例输入

    3 3
    X.P
    P#.
    ..Y
    2 2
    XP
    PY

    样例输出

    1 3
    1 2

    提示

    1<=n,m<=200

    这是一道水题,却为什么debug那么久呢....

    考虑不全面, 只用一个二维数组初始化为0, 然后分别以X,Y为起点bfs. 更新d[i][j]=max(d[i][j], len);

    len表示bfs时距离起点的距离. 这里有漏洞啊

    可能有点P点到不了, 最后其值为0. 反而是最小的了

    可能P点可以到X,但不可以到Y. 题目要求两点都可以到达(其实不存在这样的点)

    还有 一定要记得初始化!!!(那么不细心,怎么追的上你啊)

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 207;
    const int inf = 0x3f3f3f3f;
    char mp[N][N]; 
    bool vis[N][N]; 
    int d[N][N];
    int dx[] = {0, 0, 1, -1};
    int dy[] = {1, -1, 0, 0};
    int n, m;
    struct node {
        int x, y;
        int val;
    };
    bool isok(int x, int y) {
        return (x >= 1 && x <= n && y >= 1 && y <= m);
    }
    void bfs(int x, int y) {
        memset(vis, 0, sizeof(vis));
        queue <node> q;
        node tmp = {x, y, 0}; vis[x][y] = 1;
        q.push(tmp);
        while (!q.empty()) {
            tmp = q.front();
            q.pop();
            int sx = tmp.x, sy = tmp.y;
            d[sx][sy] = max (d[sx][sy], tmp.val);
            for (int i = 0; i < 4; i++) {
                int tx = sx + dx[i];
                int ty = sy + dy[i];
                if (isok(tx, ty) && mp[tx][ty] != '#' && !vis[tx][ty]) {
                    vis[tx][ty] = 1;
                    node tm = {tx, ty, tmp.val + 1};
                    q.push(tm);
                }
            }
        }
    }
    int main ()
    {
        int x1, y1, x2, y2;
        while (~scanf("%d %d", &n, &m)) {
            for (int i = 1; i <= n; i++)
                for (int j = 1; j <= m; j++) {
                    scanf(" %c", &mp[i][j]);
                    if (mp[i][j] == 'X') {
                        x1 = i; y1 = j;
                    }
                    if (mp[i][j] == 'Y') {
                        x2 = i; y2 = j;
                    }
                }
            memset(d, 0, sizeof(d)); // 记得要初始化
            bfs(x1, y1);
            bfs(x2, y2);
            int ans = inf, x, y;
            for (int i = 1; i <= n; i++)
                for (int j = 1; j <= m; j++)
                    if (mp[i][j] == 'P' && d[i][j] && d[i][j] < ans) {
                        ans = d[i][j];
                        x = i; y = j;
                    }
            printf("%d %d
    ", x, y);
        }
        return 0;
    }
  • 相关阅读:
    好元素(good)
    三条线 (Standard IO)
    计数排序-自然顺序Comparable
    贪心算法之田忌赛马
    bzoj3400
    bzoj1704
    CF Round #456 (Div. 2)
    LA3029
    bzoj3000
    bzoj3623
  • 原文地址:https://www.cnblogs.com/xidian-mao/p/11028803.html
Copyright © 2011-2022 走看看