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){ && grid[i-][j] == ][j] == ){ visited[i-][j] = ; DFS(grid, visited, i-, j); } && grid[i][j-] == ] == ){ visited[i][j-] = ; DFS(grid, visited, i, j-); } ].size(); && grid[i+][j] == ][j] == ){ visited[i+][j] = ; DFS(grid, visited, i+, j); } && grid[i][j+] == ] == ){ visited[i][j+] = ; DFS(grid, visited, i, j+); } } int numIslands(vector< vector<char> >& grid) { int n1 = grid.size(); ) ; ].size(); ) ; vector< vector<)); ; ;i<n1;i++){ ;j<n2;j++){ ' && not visited[i][j]){ num++; DFS(grid, visited, i, j); } } } return num; } };