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

华为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.lryc.cn/news/112868.html

相关文章:

  • txt去重
  • 系统集成测试与验收
  • ElementPlus文件上传 ,在上传前钩子中判断文件是否为图片
  • 涂鸦智能获Matter Non-VID Scoped PAA资质 助力开发者拥抱Matter生态
  • nsqd的架构及源码分析
  • ​LeetCode解法汇总344. 反转字符串
  • 【C语言基础】数组的高级应用(上)
  • 面试题:bind、call、apply 区别?如何实现一个 bind?
  • 【SpringBoot学习笔记】01.第一个程序HelloWorld
  • 【学会动态规划】买卖股票的最佳时机含手续费(16)
  • 网络原因导致git下载报错处理办法
  • APP后端选择什么服务器
  • 什么是反射机制,反射机制的应用场景
  • Visual Studio 2019 实用功能设置(背景颜色,代码字体及行号设置)
  • 简述Mysql索引
  • windows .gitignore 加入文件名后 依然可以从git status中看到文件问题
  • 召唤神龙打造自己的ChatGPT
  • 裝修公司同室內設計公司有咩分別?
  • android oaid
  • 利用XSS在线平台获取用户cookie
  • rsync 命令以及脚本使用
  • 【数理知识】协方差,随机变量的的协方差,随机变量分别是单个数字和向量时的协方差
  • WebDAV之π-Disk派盘+可达漫画
  • Spring中Bean的线程安全问题
  • Java spring boot 全解Camunda 7,从 0 到 1 构建工作流平台——第二节:Spring boot 简单集成
  • 手持式静电测试仪的运用原理
  • 【css问题】flex布局中,子标签宽度超出父标签宽度,导致布局出现问题
  • 【vue3】前端应用中使用WebSocket与服务器进行通信并管理连接状态。
  • 服务端高并发分布式结构演进之路
  • 微服务基础总结