LeetCode 200.岛屿的个数
给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。
示例 1:
输入:
11110
11010
11000
00000
输出: 1
示例 2:
输入:
11000
11000
00100
00011
输出: 3
和之前的DFS寻找最短路径不同,这道题没有了终点,所以不需要我们回退时,将点设置为可行。首先找到一个可行点,然后将这个可行点可以到达的地方全部感染,这就是一个岛。我们再搜寻是否有其他未感染可行点,继续感染。
#include <iostream> #include <vector> using namespace std; int arr[4][2] = { 1, 0, -1, 0, 0, 1, 0, -1 }; void infact(vector<vector<char> >& grid, int i, int j) { if (i < 0 || i >= grid.size() || j < 0 || j >= grid[0].size() || grid[i][j] != '1') { return; } for (int k = 0; k < 4; ++k) {//上下左右全部都要搜寻完 grid[i][j] = '2'; int ni = i + arr[k][0]; int nj = j + arr[k][1]; infact(grid, ni, nj); } } int numIslands(vector<vector<char>>& grid) { int island = 0; for (size_t i = 0; i < grid.size(); ++i) { for (size_t j = 0; j < grid[0].size(); ++j) { if (grid[i][j] == '1') { infact(grid, i, j); ++island; } } } return island; } int main() { vector<vector<char> > map = { {'1','1','1','1','0'}, {'1','1','0','1','0'}, {'1','1','0','1','0'}, {'0','0','1','0','1'} }; cout << numIslands(map); system("PAUSE"); return 0; }