floodfill算法题目(二)

目录

一:被围绕的区域

1.1题目

1.2算法原理

1.3代码

二:太平洋大西洋水流问题

2.1题目

2.2算法原理

2.3代码

三:扫雷游戏

3.1题目

3.2算法原理

3.3代码

四:衣橱整理

4.1题目

4.2算法原理

4.3代码


一:被围绕的区域

1.1题目

题目链接:https://leetcode.cn/problems/surrounded-regions/


1.2算法原理


1.3代码

cpp 复制代码
class Solution {
public:
    int dx[4] = {0,0,-1,1};
    int dy[4] = {-1,1,0,0};
    int m = 0, n =0;

    void solve(vector<vector<char>>& board) 
    {
        m = board.size(),n = board[0].size();

        //1.把包含边界'O'的区域全部替换为字符'.'
        for(int i = 0; i < m;i++)
        {
            if(board[i][0] == 'O')  dfs(board,i,0);  
            if(board[i][n-1] == 'O')  dfs(board,i,n-1);  
        }
        for(int j = 0; j < n;j++)
        {
            if(board[0][j] == 'O')  dfs(board,0,j);
            if(board[m-1][j] == 'O')  dfs(board,m-1,j);   
        }

        //2.把'.'换成'O','O'换成'X'
        for(int i = 0; i < m; i++)
            for(int j = 0;j < n; j++)
            {
                if(board[i][j] == '.') board[i][j] = 'O';
                else if(board[i][j] == 'O') board[i][j] = 'X';                
            }
       
    }

    void dfs(vector<vector<char>>& board,int i, int j)
    {
        board[i][j] = '.';

        for(int k = 0; k <4;k++)
        {
            int x = i + dx[k],y = j + dy[k];

            if(x >= 0 && x < m && y >=0 && y <n && board[x][y] == 'O')
            {
                dfs(board,x,y);
            }
        }
    }
};

二:太平洋大西洋水流问题

2.1题目

题目链接:https://leetcode.cn/problems/pacific-atlantic-water-flow/description/


2.2算法原理


2.3代码

cpp 复制代码
class Solution {
public:
    int dx[4] = {0,0,-1,1};
    int dy[4] = {-1,1,0,0};
    int m = 0, n =0;

    vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) 
    {
        m = heights.size(),n = heights[0].size();

        vector<vector<int>> ret;
        vector<vector<bool>> pac(m,vector<bool>(n));
        vector<vector<bool>> atl(m,vector<bool>(n));


        //处理太平洋
        for(int i = 0; i < m;i++)  dfs(heights,i,0,pac);  
        for(int j = 0; j < n;j++)  dfs(heights,0,j,pac);
        //处理大西洋
        for(int i = 0; i < m;i++)  dfs(heights,i,n-1,atl);  
        for(int j = 0; j < n;j++)  dfs(heights,m-1,j,atl);

        for(int i = 0; i < m; i++)
            for(int j = 0; j < n;j++)
                if(pac[i][j] && atl[i][j])
                    ret.push_back({i,j});
        
        return ret;
    }

    void dfs(vector<vector<int>>& heights,int i, int j,vector<vector<bool>>& vis)
    {
        vis[i][j] = true;

        for(int k = 0; k <4;k++)
        {
            int x = i + dx[k],y = j + dy[k];
            if(x >= 0 && x < m && y >=0 && y <n && !vis[x][y] &&(heights[x][y] >= heights[i][j]))
            {
               dfs(heights,x,y,vis); 
            }  
        }

    }   
};

三:扫雷游戏

3.1题目

题目链接:https://leetcode.cn/problems/minesweeper/description/


3.2算法原理


3.3代码

cpp 复制代码
class Solution {
public:
    int dx[8] = {0,0,-1,1,-1,-1,1,1};
    int dy[8] = {-1,1,0,0,-1,1,-1,1};
    int m,n;

    vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) 
    {
        m = board.size(),n = board[0].size();

        //点击到地雷
        if(board[click[0]][click[1]] == 'M')
        {
            board[click[0]][click[1]] = 'X';
            return board;
        }
        
        dfs(board,click[0],click[1]);

        return board;
    }

    void dfs(vector<vector<char>>& board, int i, int j)
    {
        //周围有几个地雷
        int cont = 0;
        for(int k = 0; k <8; k++)
        {
            int x = i + dx[k], y = j+dy[k];
            if(x >= 0 && x< m&& y >=0 && y < n && board[x][y] == 'M')
                cont++;
        }

        //没有地雷,将周围展开
        if(cont == 0)
        {
            board[i][j] = 'B';
            for(int k = 0; k <8; k++)
            {
                int x = i + dx[k], y = j+dy[k];
                if(x >= 0 && x< m&& y >=0 && y < n && board[x][y] == 'E')
                    dfs(board,x,y);
            }
        }
        else//有地雷,显示地雷个数,不再展开四周
        {
            board[i][j] = cont + '0';
        }
    }
};

四:衣橱整理

4.1题目

题目链接:https://leetcode.cn/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof/


4.2算法原理


4.3代码

cpp 复制代码
class Solution {
public:
    int ret = 0;
    int dx[2] = {0,1};
    int dy[2] = {1,0};
    int m ,n;
    vector<vector<bool>> vis;

    int digit(int num)
    {
        int sum = 0;
        while(num)
        {
            sum += num%10;
            num /= 10;
        }
        return sum;
    }

    int wardrobeFinishing(int _m, int _n, int cnt)
    {
        m = _m, n = _n;
        vis = vector<vector<bool>>(m,vector<bool>(n));
        dfs(0,0,cnt);
        return ret;
    }  

    void dfs(int i, int j,int cnt)
    {
        vis[i][j] = true;
        ret++;
        for(int k = 0; k < 2;k++)
        {
            int x = i +dx[k],y = j + dy[k];
            if(x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && digit(x)+digit(y)<= cnt)
            {
                dfs(x,y ,cnt);
            }
        }
    } 
};
相关推荐
Logic10129 分钟前
C语言/数据结构位运算题解:异或XOR找出飞行棋中的“独特颜色棋子“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
罗西的思考1 小时前
机器人模型(WM / WAM / VLA)综合分析与对比:从「看」到「想」再到「做」
人工智能·算法·机器学习
Logic1012 小时前
C语言/数据动态规划题解:翻转一次子数组后的最大子数组和——四状态DP(O(n)时间O(1)空间)
c语言·数据结构·动态规划·时间复杂度·算法题·状态机dp·最大子数组和
无小道2 小时前
C++——列表初始化
c++·列表初始化
小哈里3 小时前
【知识】从学科到实践:自然・工程・社科・人文|算法・研发・产品・品牌设计
程序人生·算法·产品·设计·工程
blueSatchel3 小时前
c++action 编写(ros-humble)
c++·ros2
小π军3 小时前
最大重叠区间数量
数据结构·算法
镜像视界(浙江)科技有限公司3 小时前
《视频孪生之上:二维展示终结,三维空间计算重构城市逻辑》——跨摄像连续表达 × 三角测量厘米级定位 × 动态轨迹建模,构建新一代城市空间
大数据·人工智能·算法·矩阵·音视频·空间计算
a187927218314 小时前
【算法】双指针与滑动窗口(二):滑动窗口——吃进、判定、吐出
算法·leetcode·双指针·滑动窗口·原理·模板·算法讲解
铭哥的编程日记4 小时前
从一道 LeetCode Hard 到吃透一类题:加权区间调度「排序 + 二分 + DP」
算法·leetcode·职场和发展