2022年1月28日 星期五

1254, Number of closed islands

====
1254, Number of closed islands
====
DFS from each unvisited node/island problem

====
a)
----
1. 題目給予一個vec<vec<char>>的網絡(grid
生成一個vec<vec<bool>>的visited
來表示這個node是不是檢查過了
//因為DFS有上下左右 可能先前被查過了

2. (看題目)定義DFS的行為:
DFS( grid, visited, i, j, m, n )
->
如果超界, 如果是'0', 如果造訪過了 return
else, 
visited改成true
這個node的上下左右去做DFS

3. 回到main(看題目)定義main的行為:
for for grid
如果是'1', 如果還沒造訪過
DFS( grid, visited, i, j, m, n )
count++
//因為DFS會做完, 能連到的都連完了, 才跳出
//就找到一個island
//如果for又找到 應該又是全新的island 故重新算重新加

====
class Solution{

void DFS( vec<vec<int>>&grid, vec<vec<bool>>&visited, int i, j, m, n){
  if i<0 || j<0 || i>=m || j>=n || visited(i,j) || grid(i,j)!='1'
    return

  visited(i,j)=true
  DFS( grid, visited, i-1, j, m, n)
  DFS(i+1
  DFS(j-1
  DFS(j+1
}

public:
int closedIsland (vec<vec<int>>&grid){
  int m=grid.size()
  int n=grid[0].size()
  vec<vec<bool>> visited(m, vec<bool>(n, false))

  int count=0
  for i-m
    for j-n
      if( grid [i][j] == '1' && !visited[i][j] ){
        DFS( grid, visited, i, j, m, n)
        count++
      }
  return count
}
};


沒有留言:

張貼留言