当前位置: 首页 > article >正文

力扣-图论-18【算法学习day.68】

前言

###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!


习题

1.扫雷游戏

题目链接:529. 扫雷游戏 - 力扣(LeetCode)分析:注意只有相邻没有地雷的方块被挖后继续递归下去

代码:

class Solution {
    char[][] board;
    int[][] flag;
    int n, m;

    public char[][] updateBoard(char[][] board, int[] click) {
        this.board = board;
        n = board.length;
        m = board[0].length;
        flag = new int[n][m];
        if (board[click[0]][click[1]] == 'M') {
            board[click[0]][click[1]] = 'X';
            return board;
        }
        recursion(click[0], click[1]);
        return board;
    }

    public void recursion(int x,int y){
        flag[x][y] = 1;
        char c = line(x,y);
        // System.out.println(x+"           "+y+"          "+c);
        if(c=='0'){
            board[x][y] = 'B';
            if(x+1<n){
                if(board[x+1][y]=='E'&&flag[x+1][y]==0){
                     recursion(x+1,y);
                }
                if(y+1<m&&board[x+1][y+1]=='E'&&flag[x+1][y+1]==0){
                    recursion(x+1,y+1);
            }
                if(y-1>=0&&board[x+1][y-1]=='E'&&flag[x+1][y-1]==0){
                    recursion(x+1,y-1);
            }
             }
            if(x-1>=0){
                if(board[x-1][y]=='E'&&flag[x-1][y]==0){
                    recursion(x-1,y);
                }
                if(y+1<m&&board[x-1][y+1]=='E'&&flag[x-1][y+1]==0){
                    recursion(x-1,y+1);
            }
                if(y-1>=0&&board[x-1][y-1]=='E'&&flag[x-1][y-1]==0){
                    recursion(x-1,y-1);
            }
        }
        if(y-1>=0&&board[x][y-1]=='E'&&flag[x][y-1]==0){
            recursion(x,y-1);
        }
        if(y+1<m&&board[x][y+1]=='E'&&flag[x][y+1]==0){
            recursion(x,y+1);
        }
        }else{
            board[x][y] = c;
        }
    }

    public char line(int x,int y){
        int flag  = 0;
        if(x+1<n){
            if(board[x+1][y]=='M')flag++;
            if(y+1<m&&board[x+1][y+1]=='M')flag++;
            if(y-1>=0&&board[x+1][y-1]=='M')flag++;
        }
        if(x-1>=0){
            if(board[x-1][y]=='M')flag++;
            if(y+1<m&&board[x-1][y+1]=='M')flag++;
            if(y-1>=0&&board[x-1][y-1]=='M')flag++;
        }
        if(y-1>=0&&board[x][y-1]=='M'){
            flag++;
        }
        if(y+1<m&&board[x][y+1]=='M'){
            flag++;
        }
        return (char)('0'+flag);
    }
}

2.二维网格图中探测环

题目链接: 1559. 二维网格图中探测环 - 力扣(LeetCode)

附上大佬代码:

class Solution {
    public boolean containsCycle(char[][] grid) {
        m = grid.length;
        n = grid[0].length;
        visited = new boolean[m][n];
        for (int i = 0; i < m; ++i) 
            for (int j = 0; j < n; ++j) 
                if (!visited[i][j] && bfs(i, j, grid))
                    return true;
        return false;
    }

    private boolean bfs(int i, int j, char[][] grid) {
        queue.offer(new int[]{i, j});
        visited[i][j] = true;
        while (!queue.isEmpty()) {
            int[] node = queue.poll();
            int neibors = 0, size = queue.size();
            for (int[] dir : dirs) {
                int row = node[0] + dir[0], col = node[1] + dir[1];
                if (isValid(row, col) && grid[row][col] == grid[node[0]][node[1]]) {
                    ++neibors;
                    if (!visited[row][col]) {
                        queue.offer(new int[]{row, col});
                        visited[row][col] = true;
                    }
                }
            }
            if (neibors - 1 > queue.size() - size)
                return true;
        }
        return false;
    }

    int m, n;
    boolean[][] visited;
    Queue<int[]> queue = new LinkedList<>();
    int[][] dirs = new int[][]{{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

    private boolean isValid(int i, int j) {
        return i >=0 && j >= 0 && i < m && j < n;
    }
}

 后言

上面是力扣图论专题,下一篇是其他的习题,希望有所帮助,一同进步,共勉!


http://www.kler.cn/a/451354.html

相关文章:

  • 论文DiffBP: generative diffusion of 3D molecules for target protein binding
  • clickhouse复现修复 结构需要清理 错误 structure need clean
  • webrtc获取IceCandidate流程
  • 21.打印文件地址 C#例子
  • 工控触摸屏用winForms来构建框架,效果还是很不错的
  • Canoe E2E校验自定义Checksum算法
  • 掌握 Ansys ACP 中的参考方向:简化复杂的复合材料设计
  • 怎么设置电脑密码?Windows和Mac设置密码的方法
  • RPC入门教学(一) ———— RPC介绍与protobuf的介绍与使用
  • QT--信号与槽机制
  • k8s dashboard可视化操作界面的安装
  • 利用Converge许可分析提高软件使用效率
  • windows安装java
  • 深度学习day5|用pytoch实现运动鞋识别
  • 【人工智能离散数学基础】——深入详解图论:基础图结构及算法,应用于图神经网络等
  • 微信小程序中momentjs无法切换中文问题处理
  • 鸿蒙(HarmonyOS)原生AI能力之文本识别
  • openssl交叉编译(这次基本上正规了)
  • QT的前景与互联网岗位发展
  • [OpenGL]使用 Compute Shader 实现矩阵点乘
  • 分布式测试插件 pytest-xdist 使用详解
  • 信号仿真高级工程师面试题
  • Ubuntu下通过Docker部署Caddy服务器
  • Meta如何用极致技术实现接近完美的缓存一致性?
  • HAPTION Virtuose 3D RV力反馈设备
  • 【NI国产替代】基于国产FPGA+全志T3的全国产16振动+2转速(24bits)高精度终端采集板卡