Leetcode959. Regions Cut By Slashes由斜槓劃分區域
阿新 • • 發佈:2019-01-12
在由 1 x 1 方格組成的 N x N 網格 grid 中,每個 1 x 1 方塊由 /、\ 或空格構成。這些字元會將方塊劃分為一些共邊的區域。
(請注意,反斜槓字元是轉義的,因此 \ 用 "\\" 表示。)。
返回區域的數目。
示例 1:
輸入: [ " /", "/ " ] 輸出:2 解釋:2x2 網格如下:
示例 2:
輸入: [ " /", " " ] 輸出:1 解釋:2x2 網格如下:
示例 3:
輸入: [ "\\/", "/\\" ] 輸出:4 解釋:(回想一下,因為 \ 字元是轉義的,所以 "\\/" 表示 \/,而 "/\\" 表示 /\。) 2x2 網格如下:
示例 4:
輸入: [ "/\\", "\\/" ] 輸出:5 解釋:(回想一下,因為 \ 字元是轉義的,所以 "/\\" 表示 /\,而 "\\/" 表示 \/。) 2x2 網格如下:
示例 5:
輸入: [ "//", "/ " ] 輸出:3 解釋:2x2 網格如下:
提示:
- 1 <= grid.length == grid[0].length <= 30
- grid[i][j] 是 '/'、'\'、或 ' '。
思路轉換一下,然後再搜尋就可以了。
最開始是將大小 * 2,但是在{"//", "/ "};這個案列中就錯誤了,仔細想想為什麼。
然後換成 * 3的就可以了。
class Solution { public: vector<vector<bool> > Map; vector<vector<bool> > Visit; int dx[4] = {1,-1,0,0}; int dy[4] = {0,0,1,-1}; int N; int regionsBySlashes(vector<string>& grid) { N = grid.size(); Map = vector<vector<bool> >(N * 3, vector<bool>(N * 3, false)); Visit = vector<vector<bool> >(N * 3, vector<bool>(N * 3, false)); int cntAns = 0; for(int i = 0; i < N; i++) { for(int j = 0; j < grid[i].size(); j++) { if(grid[i][j] == '\\') { Map[3 * i][3 * j] = true; Map[3 * i + 1][3 * j + 1] = true; Map[3 * i + 2][3 * j + 2] = true; } else if(grid[i][j] == '/') { Map[3 * i][3 * j + 2] = true; Map[3 * i + 1][3 * j + 1] = true; Map[3 * i + 2][3 * j] = true; } } } /* for(int i = 0; i < 3 * N; i++) { for(int j = 0; j < 3 * N; j++) { cout << Map[i][j] << (j == 3 * N - 1? '\n' : ' '); } } //*/ for(int i = 0; i < 3 * N; i++) { for(int j = 0; j < 3 * N; j++) { if(Map[i][j] == false && Visit[i][j] == false) { cntAns++; BFS(i , j); } } } return cntAns; } void BFS(int x, int y) { queue<pair<int, int> > q; q.push(make_pair(x, y)); Visit[x][y] = true; while(!q.empty()) { int i = q.front().first; int j = q.front().second; q.pop(); for(int k = 0; k < 4; k++) { int ii = i + dx[k]; int jj = j + dy[k]; if(ii < 0 || ii >= 3 * N || jj < 0 || jj >= 3 * N) continue; if(Visit[ii][jj] == true || Map[ii][jj] == true) continue; Visit[ii][jj] = true; q.push(make_pair(ii, jj)); } } } };
方法二:
並查集(未想出,帶更新)