【Leetcode】499. The Maze II

这道题我谷歌onsite刚好面到,当时没有搞出来,主要是在跟面试官聊天,没好好写程序。

这道题目虽然说不难,但是熟练度没有的话是绝对不可能在40分钟内写完的。

今天比赛我起晚了,其实是在规定时间内做出来的。

贴个CODE,SPFA

class Solution {
public:
    string findShortestWay(vector<vector<int>>& a, vector<int>& ball, vector<int>& hole) {
        M = a.size();
        N = a[0].size();
        g = vector<vector<pair<int,int>>>(N*M,vector<pair<int,int>>{});
        for (int i = 0;i < M;i++) {
            for (int j = 0;j < N;j++) {
                if (a[i][j]) continue;
                for (int k = 0;k < 4;k++) {
                    int x = i;
                    int y = j;
                    int dist = 0;
                    while (x + dx[k] >= 0 && x + dx[k] < M && y + dy[k] >= 0 && y + dy[k] < N && !a[x+dx[k]][y+dy[k]]) {
                        x += dx[k];
                        y += dy[k];
                        dist++;
                        if (x == hole[0] && y == hole[1]) break;
                    }
                    g[enc(i,j)].push_back(make_pair(enc(x,y),dist));
                }
            }
        }
        return bfs(enc(ball[0],ball[1]),enc(hole[0],hole[1]));
    }
private:
    int enc(int i,int j) {
        return i * N + j;
    }
    int M;
    int N;
    int dx[4] = {-1,0,1,0};
    int dy[4] = {0,1,0,-1};
    vector<vector<pair<int,int>>> g;
    string name[4] = {"u","r","d","l"};
    string bfs(int S,int T) {
        vector<int> queue;
        queue.push_back(S);
        int p = 0;
        int q = 1;
        auto inqueue = vector<bool>(M * N, false);
        auto visited = vector<bool>(M * N, false);
        auto bestDist = vector<int>(M * N, 0);
        auto bestS = vector<string>(M * N,"");
        visited[S] = true;
        bestDist[S] = 0;
        bestS[S] = "";
        while (p < q) {
            int x = queue[p];
            int cDist = bestDist[x];
            string cRoute = bestS[x];
            p++;
            inqueue[x] = false;
            for (int k = 0;k < 4;k++)
            {
                int y = g[x][k].first;
                if (y == x) continue;
                int nDist = cDist + g[x][k].second;
                string nRoute = cRoute + name[k];
                if (!visited[y] || nDist < bestDist[y] || (nDist == bestDist[y] && nRoute < bestS[y]))
                {
                    if (!inqueue[y]) {
                        queue.push_back(y);
                        inqueue[y] = true;
                        q++;
                    }
                    visited[y] = true;
                    bestDist[y] = nDist;
                    bestS[y] = nRoute;
                }
            }
        }
        if (!visited[T])
        return "impossible";
        else {
            return bestS[T];
        }
    }
};

权当消遣了 工作已经找好了 不过C++写点程序还是很有意思的

最近在用Java,C++不能荒废了

posted @ 2017-01-29 14:07  syb3181  阅读(757)  评论(0编辑  收藏  举报