这道题我谷歌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++不能荒废了