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);
            }
        }
    } 
};
相关推荐
v***44671 小时前
【语义分割】12个主流算法架构介绍、数据集推荐、总结、挑战和未来发展
算法·架构
roman_日积跬步-终至千里1 小时前
【模式识别与机器学习(6)】主要算法与技术(下篇:高级模型与集成方法)之进化计算(Evolutionary Computation)
人工智能·算法·机器学习
surtr11 小时前
区间查询mex异或gcd (焰与霜的共鸣,可持久化线段树+思维)
数据结构·c++·算法·数学建模·stl·动态规划
自然常数e1 小时前
深入理解指针(3)
c语言·visual studio
伯远医学1 小时前
CUT&RUN
java·服务器·网络·人工智能·python·算法·eclipse
yolo_guo1 小时前
opencv 学习: 11 图片像素位置变换,以图片加水波纹特效为例
c++·opencv·计算机视觉
圣保罗的大教堂1 小时前
leetcode 2872. 可以被 K 整除连通块的最大数目 困难
leetcode
序属秋秋秋1 小时前
《Linux系统编程之进程环境》【地址空间】
linux·运维·服务器·c语言·c++·系统编程·进程地址空间
SunkingYang1 小时前
Visual Studio 2022开发C/C++库:解决只生成DLL未生成LIB文件的完整指南
c++·库文件·未生成lib·只生成dll