TopCoder SRM 659 Div2 Problem 500 - PublicTransit (思维)

题意

有两个虫洞,抵达一个可以瞬间到达另一个,现在问可以任意放置虫洞,求两点之间任意位置的最短路径。

思路

一开始用二分+优先队列TLE了。。

因为这题没有障碍物,所以可以不用搜索,直接计算。

枚举两个虫洞的位置,枚举起点和终点。

起点到终点有三种方式:
1. 直接到。
2. 起点→虫洞1→虫洞2→终点
3. 起点→虫洞2→虫洞1→终点。

只要把这三种方式的路径长度算出来取最小值即可。

代码

class PublicTransit {
    int row, col;

    int dis(int a, int b, int aa, int bb)
    {
        return abs(a-aa) + abs(b-bb);
    }

    public:
    int minimumLongestDistance(int R, int C) {
        row = R, col = C;
        int ans = INF;
        FOOR(i, 1, row) FOOR(j, 1, col) FOOR(ii, 1, row) FOOR(jj, 1, col)
        {
            int curAns = 0;
            FOOR(k, 1, row) FOOR(l, 1, col) FOOR(kk, 1, row) FOOR(ll, 1, col)
            {
                int d1 = dis(k, l, kk, ll);
                int d2 = dis(k, l, i, j) + dis(ii, jj, kk, ll);
                int d3 = dis(k, l, ii, jj) + dis(i, j, kk, ll);
                curAns = max(curAns, min(d1, min(d2, d3)));
            }
            ans = min(ans, curAns);
        }
        return ans;
    }
};

你可能感兴趣的:(TopCoder)