Number of Islands

来源:互联网 发布:json和jsonp的区别 编辑:程序博客网 时间:2024/06/07 19:59

问题描述:

Given a 2d grid map of ‘1’s (land) and ‘0’s (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.

Example1:
11110
11010
11000
00000
Answer:1
Example2:
11000
11000
00100
00011
Answer:3

思路分析:

这道题刚开始的时候有点无从下手,但仔细理解题目的第二句话,我们可以提取出这样一个信息:island是由水平或者垂直方向相邻的land组成的连通区域,周围都是water,于是抽象为图模型就是要找到“0”和“1”的图中连通的“1”区域的数量。进一步,我们可以使用图论中两个基本的搜索算法DFS和BFS,快速解决问题。这里选择DFS深度优先搜索算法,大概步骤是:
1)声明一个visited的二维vector,初始化值全为“0”,已经访问过的节点的visited值改成“1”;
2)遍历图中的各个节点,如果节点的值为“1”且visited值为“0”,那么就调用countIslands函数,DFS找到该节点相邻的所有“1”节点,这块区域就是一个island。注意DFS过程就是递归调用countIslands函数,只是将此函数的参数row和column值修改为该节点的上、下、左、右四个相邻节点的相应row和column值而已。

代码实现:

class Solution {public:    int numIslands(vector<vector<char>>& grid) {        if (grid.empty())             return 0;        else {            int row = grid.size();            int column = grid[0].size();            int number = 0;     //island的数量            vector<vector<int>> visited;            //初始化二维vector            visited.resize(row);            for (int k = 0; k < row; k++) {                visited[k].resize(column);            }            for (int i = 0; i < row; i++) {                for (int j = 0; j < column; j++) {                    //注意grid的元素类型是char而不是int                    if (!visited[i][j] && grid[i][j] == '1') {                        countIslands(grid, visited, i, j);                        number++;                    }                }            }            return number;        }    }    void countIslands(vector<vector<char>>& grid, vector<vector<int>>& visited, int row, int column) {        //row和column超过grid范围        if (row < 0 || row > grid.size()-1 || column< 0 || column > grid[0].size()-1) {           return;        }        //“0”位置或者访问过的"1"位置        if (grid[row][column] != '1' || visited[row][column]) {            return;        }        //找到一块连通的“1”区域        else {            visited[row][column] = 1;            countIslands(grid, visited, row, column-1);            countIslands(grid, visited, row, column+1);            countIslands(grid, visited, row-1, column);            countIslands(grid, visited, row+1, column);        }    }};