leetcode刷到这道题:
给定一个由 '1'
(陆地)和 '0'
(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。
示例 1:
输入: 11110 11010 11000 00000 输出: 1
示例 2:
输入: 11000 11000 00100 00011 输出: 3
开始一直没思路,后来看别人的思路,发现就是求连通集的数目。然后发现已经把DFS、BFS怎么写忘光了。
其实是想说,老师有教怎么写,我只是把老师的教法忘光了,看了一下以前的代码,拢了拢思路,决定管它的BFS、DFS、Prime、Dijsktra...自己写好了
于是就根据DFS的思路开始解这道题,从任意一个点开始搜,如果相邻的点为1且没有被访问过,就用递归接着这个点搜,一直搜到相邻点不为1或者已经被访问过为止
第一轮搜索完了,看剩下的点有没有值为1且没有被访问过,有的话用第一轮的思路接着搜。就搜完了。
代码如下:
class Solution { public: void DFS(vector< vector<char> >& grid, vector< vector<int> >& visited, int i, int j){ if(i>0 && grid[i-1][j] == '1' && visited[i-1][j] == 0){ visited[i-1][j] = 1; DFS(grid, visited, i-1, j); } if(j>0 && grid[i][j-1] == '1' && visited[i][j-1] == 0){ visited[i][j-1] = 1; DFS(grid, visited, i, j-1); } int n1 = grid.size();int n2 = grid[0].size(); if(i<n1-1 && grid[i+1][j] == '1' && visited[i+1][j] == 0){ visited[i+1][j] = 1; DFS(grid, visited, i+1, j); } if(j<n2-1 && grid[i][j+1] == '1' && visited[i][j+1] == 0){ visited[i][j+1] = 1; DFS(grid, visited, i, j+1); } } int numIslands(vector< vector<char> >& grid) { int n1 = grid.size(); if(n1==0) return 0; int n2 = grid[0].size(); if(n2 == 0) return 0; vector< vector<int> > visited(n1,vector<int>(n2,0)); int num = 0; for(int i = 0;i<n1;i++){ for(int j = 0;j<n2;j++){ if(grid[i][j] == '1' && not visited[i][j]){ num++; DFS(grid, visited, i, j); } } } return num; } };