LeetCode 200. 岛屿数量 (DFS)
题目链接:https://leetcode-cn.com/problems/number-of-islands/
给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。
示例 1:
输入:
11110
11010
11000
00000
输出: 1
示例 2:
输入:
11000
11000
00100
00011
输出: 3
1 int dx[4]={1,-1,0,0}; 2 int dy[4]={0,0,1,-1}; 3 void dfs(char** grid, int gridSize, int* gridColSize,int x,int y) 4 { 5 int i,j; 6 for(i=0;i<4;i++){ 7 int nx=x+dx[i],ny=y+dy[i]; 8 if(nx>=0&&nx<gridSize&&ny>=0&&ny<gridColSize[0]&&grid[nx][ny]=='1'){ 9 grid[nx][ny]='0'; 10 dfs(grid,gridSize,gridColSize,nx,ny); 11 } 12 } 13 return ; 14 } 15 int numIslands(char** grid, int gridSize, int* gridColSize){ 16 int i,j,res=0; 17 for(i=0;i<gridSize;i++){ 18 for(j=0;j<gridColSize[0];j++){ 19 if(grid[i][j]=='1'){ 20 dfs(grid,gridSize,gridColSize,i,j); 21 res++; 22 } 23 } 24 } 25 return res; 26 }
DFS栈实现:
1 class Solution { 2 public: 3 typedef pair<int,int> P; 4 int N,M; 5 int dx[4]={1,0,0,-1}; 6 int dy[4]={0,-1,1,0}; 7 int x,y,nx,ny; 8 int numIslands(vector<vector<char>>& grid) { 9 if(grid.size()==0) return 0; 10 int res=0; 11 N=grid.size(),M=grid[0].size(); 12 for(int i=0;i<N;i++){ 13 for(int j=0;j<M;j++){ 14 if(grid[i][j]=='1'){ 15 res++; 16 int sx=i,sy=j; 17 stack<P> st; 18 st.push(P(sx,sy)); 19 while(!st.empty()){ 20 P p=st.top(); 21 st.pop(); 22 x=p.first,y=p.second; 23 for(int i=0;i<4;i++){ 24 nx=x+dx[i],ny=y+dy[i]; 25 if(nx>=0&&nx<N&&ny>=0&&ny<M&&grid[nx][ny]=='1'){ 26 grid[nx][ny]='0'; 27 st.push(P(nx,ny)); 28 } 29 } 30 } 31 } 32 } 33 } 34 return res; 35 } 36 };
c++
1 class Solution { 2 public: 3 int n,m,i,j; 4 void dfs(vector<vector<char>>& grid,int x,int y) 5 { 6 if(x<0||x>=n||y<0||y>=m||grid[x][y]=='0') return; 7 grid[x][y]='0'; 8 dfs(grid,x+1,y); 9 dfs(grid,x-1,y); 10 dfs(grid,x,y+1); 11 dfs(grid,x,y-1); 12 } 13 int numIslands(vector<vector<char>>& grid) { 14 if(grid.size()==0) return 0; 15 n=grid.size(),m=grid[0].size(); 16 int cnt=0; 17 for(i=0;i<n;i++){ 18 for(j=0;j<m;j++){ 19 if(grid[i][j]=='1'){ 20 cnt++; 21 dfs(grid,i,j); 22 } 23 } 24 } 25 return cnt; 26 } 27 };