1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| #include <vector> using std::vector;
class Solution { public: int countUnguarded(int m, int n, vector<vector<int> > &guards, vector<vector<int> > &walls) { vector<vector<int> > grid_map(m, vector<int>(n, 0)); int i, j; int len; int g_i, g_j; int count = 0;
len = walls.size(); for (i = 0; i < len; i++) { grid_map[walls[i][0]][walls[i][1]] = 3; }
len = guards.size(); for (i = 0; i < len; i++) { grid_map[guards[i][0]][guards[i][1]] = 2; }
for (i = 0; i < len; i++) { g_i = guards[i][0]; g_j = guards[i][1]; j = 1; while (g_i - j >= 0) { if (grid_map[g_i - j][g_j] == 2 || grid_map[g_i - j][g_j] == 3) { break; } grid_map[g_i - j][g_j] = 1; j++; }
j = 1; while (g_i + j < m) { if (grid_map[g_i + j][g_j] == 2 || grid_map[g_i + j][g_j] == 3) { break; } grid_map[g_i + j][g_j] = 1; j++; }
j = 1; while (g_j - j >= 0) { if (grid_map[g_i][g_j - j] == 2 || grid_map[g_i][g_j - j] == 3) { break; } grid_map[g_i][g_j - j] = 1; j++; } j = 1; while (g_j + j < n) { if (grid_map[g_i][g_j + j] == 2 || grid_map[g_i][g_j + j] == 3) { break; } grid_map[g_i][g_j + j] = 1; j++; } } for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { if (grid_map[i][j] == 0) { count++; } } } return count; } };
#include <stdio.h> int main() { vector<vector<int> > guards = { { 0, 0 }, { 1, 1 }, { 2, 3 } }; vector<vector<int> > walls = { { 0, 1 }, { 2, 2 }, { 1, 4 } }; int m=4, n=6; Solution s; printf("%d\n",s.countUnguarded(m, n, guards, walls)); }
|