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);
            }
        }
    } 
};
相关推荐
汀、人工智能7 分钟前
[特殊字符] 第79课:分割等和子集
数据结构·算法·数据库架构·位运算·哈希表·分割等和子集
独小乐16 分钟前
009.中断实践之实现按键测试|千篇笔记实现嵌入式全栈/裸机篇
linux·c语言·驱动开发·笔记·嵌入式硬件·arm
山甫aa18 分钟前
List 容器 -----C++的stl学习
开发语言·c++·学习
汀、人工智能18 分钟前
[特殊字符] 第74课:完全平方数
数据结构·算法·数据库架构·图论·bfs·完全平方数
CoderCodingNo23 分钟前
【GESP】C++四、五级练习题 luogu-P1177 【模板】排序
数据结构·c++·算法
Proxy_ZZ025 分钟前
从零实现LDPC比特翻转译码器:C语言实战与底层逻辑解析
c语言·算法
森G36 分钟前
58、最佳实践与注意事项---------多线程、竟态条件和同步
c++·qt
汀、人工智能37 分钟前
[特殊字符] 第76课:单词拆分
数据结构·算法·均值算法·前缀树·trie·单词拆分
CheerWWW40 分钟前
C++学习笔记——箭头运算符、std::vector的使用、静态链接、动态链接
c++·笔记·学习
Fcy6481 小时前
算法基础详解(五)二分算法——二分查找与二分答案
算法·二分算法