美文网首页
深度优先搜索系列一 leetcode题库 200 岛屿数量

深度优先搜索系列一 leetcode题库 200 岛屿数量

作者: 徐慵仙 | 来源:发表于2020-01-19 19:38 被阅读0次

    题目地址

    https://leetcode-cn.com/problems/number-of-islands/

    简析

    循环整个二维数组中的点,如果这个点为1,则将岛屿总数+1,同时从这个点出发进行搜索,把每个它能到达的点都设为2。这样同一片岛屿,就只产生一次+1。

    1 移动方式定义

    属于迷宫类问题,所有迷宫类问题,都要根据行走方式定义一个关于行走方式的数组,数组就两种方式:

    • 只能垂直移动,不能斜着走
    int mv[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//要么横向加减1,竖直方向不动;要么纵坐标加减1,水平方向不动;
    
    • 可以斜着走
    int mv[8][2]={{1,0},{-1,0},{0,1},{0,-1},{1,-1},{1,1},{-1,1},{-1,-1}};//在上述基础上,增加斜着的变化,即横纵都加减一,共四种情况
    

    2 确定for循环范围

    任何复杂问题都由简单问题组合而成,解决每一个简单问题,复杂问题自然迎刃而解。参见另一篇搜索与回溯综述,第一步,我们先确定每个可能的选择的范围,即for循环的范围。
    此题只能垂直移动,顾for循环范围为0~4,就是走mv数组中的一步。

    for(int i=0;i<4;i++){
                int xx=x+mv[i][0];
                int yy=y+mv[i][1];
    }
    

    3 判断是否可选

    选择的范围有了,但并不是范围内的任何一个点都可以使用,我们要加一个判断,如果判断条件过于复杂,则要增加一个函数。
    此处的判断需要判断两件事,

    • 一是下标有没有超过给定数组的范围。
    • 二是判断这个点是否是1,如果是0则表示水面,不用处理
    if(xx>=0&&xx<grid.size()&&yy>=0&&yy<grid[xx].size()&&grid[xx][yy]=='1')
    

    4 选择后的处理

    if条件成立后,

    • 把这个点标记成2,表示这块地已经到达过了,
    • 搜索下一层
    • 不用回溯,因为只要标记过了就可以了。

    5 完整代码

    class Solution {
    public:
        int mv[4][4]={{1,0},{-1,0},{0,1},{0,-1}};
        int numIslands(vector<vector<char>>& grid) {
            int count=0;
            for(int i=0;i<grid.size();i++)
                for(int j=0;j<grid[i].size();j++){
                    if(grid[i][j]=='1'){
                        grid[i][j]='2';
                        search(grid,i,j);
                        count++;
                    }
                }
            return count;
        }
        void search(vector<vector<char>>& grid,int x,int y){
            for(int i=0;i<4;i++){
                int xx=x+mv[i][0];
                int yy=y+mv[i][1];
                if(xx>=0&&xx<grid.size()&&yy>=0&&yy<grid[xx].size()&&grid[xx][yy]=='1'){
                    grid[xx][yy]='2';
                    search(grid,xx,yy);
                }
            }
        }
    };
    

    相关文章

      网友评论

          本文标题:深度优先搜索系列一 leetcode题库 200 岛屿数量

          本文链接:https://www.haomeiwen.com/subject/fhjrzctx.html