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);
            }
        }
    } 
};
相关推荐
We་ct15 小时前
LeetCode 205. 同构字符串:解题思路+代码优化全解析
前端·算法·leetcode·typescript
renhongxia115 小时前
AI算法实战:逻辑回归在风控场景中的应用
人工智能·深度学习·算法·机器学习·信息可视化·语言模型·逻辑回归
CoderCodingNo15 小时前
【GESP】C++四级/五级练习题 luogu-P1223 排队接水
开发语言·c++·算法
爱编码的小八嘎15 小时前
C语言对话-22.想睡觉,偶然
c语言
民乐团扒谱机15 小时前
【AI笔记】精密光时频传递技术核心内容总结
人工智能·算法·光学频率梳
sycmancia16 小时前
C++进阶01——示例
开发语言·c++
CoderCodingNo16 小时前
【GESP】C++五级/四级练习题 luogu-P1413 坚果保龄球
开发语言·c++·算法
阿猿收手吧!16 小时前
【C++】C++原子操作:compare_exchange_weak详解
java·jvm·c++
Trouvaille ~16 小时前
【Linux】网络编程基础(二):数据封装与网络传输流程
linux·运维·服务器·网络·c++·tcp/ip·通信
2301_8223663516 小时前
C++中的命令模式变体
开发语言·c++·算法