Careercup - Google面试题 - 4716965625069568

2014-05-06 00:17

题目链接

原题:

Given a 2-D matrix represents the room, obstacle and guard like the following (0 is room, B->obstacle, G-> Guard): 

0 0 0 

B G G 

B 0 0 



calculate the steps from a room to nearest Guard and set the matrix, like this 

2 1 1 

B G G 

B 1 1 

Write the algorithm, with optimal solution.

题目:有一个二维矩阵表示的迷宫,其中G表示保安人员,B表示不可穿越的墙,其他位置均为空地。如果每次可以向东南西北四个方向移动一格,请计算出每个空格离最近的保安有多远。题目给出了一个示例。

解法:既然矩阵里可能有多个保安,我的思路是以各个保安为中心,进行广度优先搜索,搜索的过程中随时更新每个空格位置的最短距离,保证全部搜索完之后所有的结果都是最小的。单次BFS的时间代价是O(n^2)级别的。

代码:

 1 // http://www.careercup.com/question?id=4716965625069568

 2 #include <queue>

 3 #include <vector>

 4 using namespace std;

 5 

 6 class Solution {

 7 public:

 8     void solve(vector<vector<int> > &matrix) {

 9         // -1 for guard

10         // -2 for blockade

11         // 0 for room

12         // > 0 for distance

13         

14         n = (int)matrix.size();

15         if (n == 0) {

16             return;

17         }

18         m = (int)matrix[0].size();

19         if (m == 0) {

20             return;

21         }

22         

23         int i, j;

24         

25         for (i = 0; i < n; ++i) {

26             for (j = 0; j < m; ++j) {

27                 if (matrix[i][j] == -1) {

28                     doBFS(matrix, i, j);

29                 }

30             }

31         }

32     };

33 private:

34     int n, m;

35     

36     bool inBound(int x, int y) {

37         return x >= 0 && x <= n - 1 && y >= 0 && y <= m - 1;

38     }

39     

40     void doBFS(vector<vector<int> > &matrix, int x, int y) {

41         queue<int> q;

42         static int dd[4][2] = {{-1, 0}, {+1, 0}, {0, -1}, {0, +1}};

43         int tmp;

44         int xx, yy;

45         int i;

46         int dist;

47         

48         q.push(x * m + y);

49         while (!q.empty()) {

50             tmp = q.front();

51             q.pop();

52             x = tmp / m;

53             y = tmp % m;

54             dist = matrix[x][y] > 0 ? matrix[x][y] : 0;

55             for (i = 0; i < 4; ++i) {

56                 xx = x + dd[i][0];

57                 yy = y + dd[i][1];

58                 if (!inBound(xx, yy) || matrix[xx][yy] < 0 || 

59                     (matrix[xx][yy] > 0 && matrix[xx][yy] <= dist + 1)) {

60                     // out of boundary

61                     // a guard or a blockade

62                     // the distance is no shorter

63                     continue;

64                 }

65                 matrix[xx][yy] = dist + 1;

66                 q.push(xx * m + yy);

67             }

68         }

69     }

70 };

 

你可能感兴趣的:(Google)