华为OD机试真题【开心消消乐】

news/2024/5/19 8:56:14 标签: 算法, 回溯, 岛屿问题, OD

1、题目描述

【开心消消乐】
给定一个N行M列的二维矩阵,矩阵中每个位置的数字取值为0或1。矩阵示例如:
1100
0001
0011
1111
现需要将矩阵中所有的1进行反转为0,规则如下:
1) 当点击一个1时,该1便被反转为0,同时相邻的上、下、左、右,以及左上、左下、右上、右下8 个方向的1(如果存在1)均会自动反转为0;
2)进一步地,一个位置上的1被反转为0时,与其相邻的8个方向的1(如果存在1)均会自动反转为0;

按照上述规则示例中的矩阵只最少需要点击2次后,所有值均为0。请问,给定一个矩阵,最少需要点击几次后,所有数字均为0?

【输入描述】
第一行输入两个整数,分别表示矩阵的行数 N 和列数 M,取值范围均为 [1,100]。接下来 N 行表示矩阵的初始值,每行均为 M 个数,取值范围 [0,1]。

【输出描述】
输出一个整数,表示最少需要点击的次数。
【实例一】
输入:

3 3
1 0 1
0 1 0
1 0 1
输出: 1,说明:上述样例中,四个角上的1均在中间的1的相邻8个方向上,因此只需要点击一次即可。

2、解题思路

此题与【岛屿数量】题类似,可用dfs回溯遍历的方法感染矩阵的位置即将符合题意的方向的1都变成0,统计需要多少次才能将矩阵中所有的值都变成0

3、参考代码

import java.util.Scanner;

/**
 * @Author 
 * @Date 2023/4/25 23:57
 */
public class 开心消消乐 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            int n = in.nextInt();
            int m = in.nextInt();
            int[][] arr = new int[n][m];
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < m; j++) {
                    arr[i][j] = in.nextInt();
                }
            }

            int res = 0;
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < m; j++) {
                    if (arr[i][j] == 1) {
                        infect(arr, i, j);
                        res++;
                    }
                }
            }

            System.out.println(res);

        }
    }

    public static void infect(int[][] arr, int x, int y) {
        if(x < 0 || y < 0 || x >= arr.length || y >= arr[0].length || arr[x][y] != 1) {
            return;
        }
        arr[x][y] = 0;  // 感染的过程
        infect(arr, x + 1, y);  // 向下
        infect(arr, x - 1, y);  // 向上
        infect(arr, x, y + 1);  // 向右
        infect(arr, x, y - 1);  // 向左
        infect(arr, x + 1, y - 1);  // 向左下
        infect(arr, x + 1, y + 1);  // 向右上
        infect(arr, x + 1, y + 1);  // 向右下
        infect(arr, x - 1, y + 1);  // 向左上
    }
}

4、相似题目

(1)岛屿数量
区别在于这题指能向四个方向感染,而【开心消消乐】能向八个方向感染

public int numIslands(char[][] grid) {
        int count = 0;
        for(int i = 0; i < grid.length; i++) {
            for(int j = 0; j < grid[0].length; j++) {
                if(grid[i][j] == '1'){
                    infect(grid, i, j);
                    count++;
                }
            }
        }
        return count;
    }
    private void infect(char[][] grid, int i, int j){
        if(i < 0 || j < 0 || i >= grid.length || j >= grid[0].length || grid[i][j] == '0') return;
        grid[i][j] = '0';
        infect(grid, i + 1, j);  // 向下
        infect(grid, i, j + 1);  // 向右
        infect(grid, i - 1, j);  // 向上
        infect(grid, i, j - 1);  // 向左
    }

http://www.niftyadmin.cn/n/4924727.html

相关文章

使用Three.js制作一个旋转多面体

之前一直对three.js比较好奇&#xff0c;但是一直没有着手学习。今天刷到一篇博客&#xff08;博主&#xff1a;1_bit&#xff09;&#xff0c;觉得挺有意思&#xff0c;就跟着敲了一下。 html: 其中canvas用于添加渲染好的元素&#xff0c;本篇文章通过CDN形式引入three.js,…

提升城市管理效率,软件机器人助力自动化处理投诉、建议、举报

在现代城市管理中&#xff0c;市民的投诉、建议和举报等事项是不可忽视的重要环节。然而&#xff0c;传统的处理方式往往需要大量的人力和时间&#xff0c;效率较低。为了提升城市管理部门的服务质量和效率&#xff0c;引入软件机器人成为一种可行的选择。 博为小帮软件机器人可…

机器学习复习题

1 单选题 ID3算法、C4.5算法、CART算法都是&#xff08; &#xff09;研究方向的算法。 A . 决策树 B. 随机森林 C. 人工神经网络 D. 贝叶斯学习 参考答案&#xff1a;A &#xff08; &#xff09;作为机器学习重要算法之一&#xff0c;是一种利用多个树分类器进行分类和预测…

selenium环境搭建

文章目录 1、下载谷歌浏览器2、下载谷歌驱动 1、下载谷歌浏览器 浏览器下载完成后&#xff0c;在任务管理器中禁止浏览器的自动更新。因为驱动版本必须和浏览器一致&#xff0c;如果浏览器更新了&#xff0c;驱动就用不起了。 2、下载谷歌驱动 谷歌驱动需要和谷歌浏览器版本…

Redis可以用作数据库吗?它的适用场景是什么?

是的&#xff0c;Redis可以用作数据库。虽然Redis通常被认为是一个内存数据库&#xff08;in-memory database&#xff09;&#xff0c;但它也可以通过持久化机制将数据保存在磁盘上&#xff0c;以便在重启后恢复数据。 Redis的适用场景包括但不限于以下几个方面&#xff1a; …

深入浅出对话系统——闲聊对话系统进阶

引言 本文主要关注生成式闲聊对话系统的进阶技术。 基于Transformer的对话生成模型 本节主要介绍GPT系列文章&#xff0c;这是由OpenAI团队推出的&#xff0c;现在大火的ChatGPT也是它们推出的。 GPT : Improving Language Understanding by Generative Pre-Traini ng 在自…

使用go获取链上数据之主动拉取-搭建环境(一)

使用go获取链上数据之主动拉取-搭建环境&#xff08;一&#xff09; 1、配置文件1.1、新建配置文件1.2、新建setting.go文件1.3、新建config.go文件 2、全局变量配置2.1、新建global.go2.2、初始化配置2.3、验证配置 在我们实际开发项目中&#xff0c;很多时候都需要从链上获取…

重庆多域名https证书去哪里申请呢

多域名https证书是一种可以为多个域名提供加密保护的数字证书&#xff0c;它不限制域名的类型&#xff0c;不论是主域名还是子域名&#xff0c;只要能通过域名验证&#xff0c;多域名https证书都可以进行保护。多域名https证书可以让网站管理员在一个证书中添加多个域名&#x…