leetcode 200 岛屿数量
深度优先搜索的想法,针对一个无向图,对这一图进行遍历,遇到一个‘1’就进行深度优先搜索,遇到的‘1’都变成‘0’,代表这一个岛屿已经被记录。岛屿的数量就是进行搜索的次数,贴代码
class Solution { private: void dfs(vector<vector<char>>& grid,int x,int y) { int m = grid.size(); int n = grid[0].size(); grid[x][y] = '0'; if(x-1>=0 && grid[x-1][y] == '1') dfs(grid,x-1,y); if(x+1<m && grid[x+1][y] == '1') dfs(grid,x+1,y); if(y-1>=0 && grid[x][y-1] == '1') dfs(grid,x,y-1); if(y+1<n && grid[x][y+1] == '1') dfs(grid,x,y+1); } public: int numIslands(vector<vector<char>>& grid) { int m = grid.size(); if(!m) return 0; int n = grid[0].size(); int num = 0; for(int i = 0 ; i < m ; i++) { for(int j = 0 ; j < n ; j++) { if(grid[i][j] == '1') { num++; dfs(grid,i,j); } } } return num; } };
广度优先搜索,单次搜索中,通过队列才存储所有周边的‘1’,每搜索到一个‘1’,就将其存入队列中,继续进行搜索,直到队列中元素清空。
1 class Solution { 2 public: 3 int numIslands(vector<vector<char>>& grid) 4 { 5 int m = grid.size(); 6 int n = grid[0].size(); 7 int nums = 0; 8 for(int i = 0 ; i < m ; i++) 9 { 10 for(int j = 0 ; j < n ; j++) 11 { 12 if(grid[i][j] == '1') 13 { 14 nums++; 15 grid[i][j] = '0'; 16 queue<pair<int,int>> neibor; 17 neibor.push({i,j}); 18 while(!neibor.empty()) 19 { 20 auto temp = neibor.front(); 21 neibor.pop(); 22 int x = temp.first; 23 int y = temp.second; 24 if(x-1>=0 && grid[x-1][y] == '1') 25 { 26 neibor.push({x-1,y}); 27 grid[x-1][y] = '0'; 28 } 29 if(x+1<m && grid[x+1][y] == '1') 30 { 31 neibor.push({x+1,y}); 32 grid[x+1][y] = '0'; 33 } 34 if(y-1>=0 && grid[x][y-1] == '1') 35 { 36 neibor.push({x,y-1}); 37 grid[x][y-1] = '0'; 38 } 39 if(y+1<n && grid[x][y+1] == '1') 40 { 41 neibor.push({x,y+1}); 42 grid[x][y+1] = '0'; 43 } 44 } 45 } 46 } 47 } 48 return nums; 49 } 50 };

浙公网安备 33010602011771号