问题:
给定数组0代表海水,1代表陆地,若陆地上下左右皆为海水,那么则称该陆地为一小岛。
求给定数组中有多少小岛。
Example 1: Input: 11110 11010 11000 00000 Output: 1 Example 2: Input: 11000 11000 00100 00011 Output: 3
解法:
图的DFS,深度优先搜索。
遍历图,
若遇到小岛陆地‘1’,则发现新岛,res++,并由此点DFS,(上下左右四个方向)遍历全岛,标记为0,即沉掉整座岛。
之后再发现新岛陆地‘1’,则为新岛。
代码参考:
1 class Solution { 2 public: 3 void visited(int i, int j, int m, int n, vector<vector<char>>& grid){ 4 if(i<0 || i>=n || j<0 || j>=m || grid[i][j]=='0') return; 5 grid[i][j]='0'; 6 visited(i-1,j,m,n,grid); 7 visited(i+1,j,m,n,grid); 8 visited(i,j-1,m,n,grid); 9 visited(i,j+1,m,n,grid); 10 return; 11 } 12 int numIslands(vector<vector<char>>& grid) { 13 int i, j, n, m; 14 int res=0; 15 n=grid.size(); 16 if(n==0) return 0; 17 m=grid[0].size(); 18 for(i=0; i<n; i++){ 19 for(j=0; j<m; j++){ 20 if(grid[i][j]=='1'){ 21 res++; 22 visited(i, j, m, n, grid); 23 } 24 } 25 } 26 return res; 27 } 28 };