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);
            }
        }
    } 
};
相关推荐
星恒随风2 分钟前
C++ 类和对象入门(三):拷贝构造、赋值运算符重载和深浅拷贝
开发语言·c++·笔记·学习
Cx330❀3 分钟前
【MySQL基础】库与表的全面操纵指南
linux·服务器·网络·数据库·c++·mysql
凡人叶枫4 分钟前
Effective C++ 条款03:尽可能使用 const
linux·开发语言·c++·嵌入式开发
FFZero112 分钟前
[mpv脚本系统] (五) C层系统调用的实现: mpv client通信机制
c语言·音视频
小欣加油18 分钟前
Leetcode31 下一个排列
数据结构·c++·算法·leetcode·职场和发展
Cx330❀23 分钟前
【Linux网络】高性能 TCP 服务器:从多线程到线程池的架构演进与落地实践
linux·运维·服务器·网络·c++·tcp/ip·架构
c2385628 分钟前
C++的IO流深入理解(上)
开发语言·c++
炘爚32 分钟前
Phase 4:业务线程池 — IO/计算解耦
linux·c++
张小姐的猫34 分钟前
【Linux】多线程 —— 线程池 | 单例模式 | 常见锁
linux·运维·服务器·c++·单例模式·设计模式·策略模式
_日拱一卒34 分钟前
LeetCode:39组合总和
java·算法·leetcode·职场和发展