• 华为OD机考算法题:机器人活动区域


    题目部分

    题目机器人活动区域
    难度
    题目说明有一个机器人,可放置于 M x N 的网格中任意位置,每个网格包含一个非负整数编号,当相邻网格的数字编号差值的绝对值小于等于 1 时,机器人可以在网格间移动。
    求机器人可活动的最大范围对应的网络点数目。
    说明:机器人之鞥你在相邻网格间上、下、左、右移动。
    示例,输入如下网格:


    输出:6
    说明:图中绿色区域,相邻网格差值的绝对值小于或等于 1,且为最大区域,对应的网格个数为 6。


    示例 2,输入以下网格:

    输出:1
    说明:任意两个相邻网格之差的绝对值都大于 1,机器人不能在网格间移动,只能在单个网格内活动,对应网格个数为 1。
    输入描述第一行输入 M 和 N。M 表示网格的行数,N 表示网格的列数。
    之后的 M 行表示网格的数值,每个 N 个数值(假设数值为 k),数值间用单个空格间隔,行首和行尾无多余的空格。
    M、N、k 均为整数,且 1 <= M, N <= 150,0 <= k <= 50。
    输出描述输出 1 行,包含 1 个数字,表示最大活动区域对应的网格个数。
    补充说明假设输入个数和输入数据全部合法。
    ------------------------------------------------------
    示例
    示例1
    输入4 4
    1 2 5 2
    2 4 4 5
    3 5 7 1
    4 6 2 4
    输出6
    说明见描述中示例 1,最大区域对应的网格个数为 6。
    示例2
    输入2 3
    1 3 5
    4 1 3
    输出1
    说明任意两个相邻网格之差的绝对值都大于 1,机器人无法移动,最大区域对应网格点个数为 1。


    解读与分析

    题目解读

    此题要求从一个二维的网格中,找出 1 到多个区域,确保每个区域中相邻格子的数字之差不大于 1。

    分析与思路

    在 Windows 95 上,有一款经典的扫雷游戏,点下一个方块,如果这个方块不是地雷,就会显示它周围(8个方向)的地雷总数,如果它附近没有地雷,那么周围 8 个方向的方块也会自动点开,如果这 8 个方向的方块……。

    在算法上,此题与扫雷算法类似。

    可以从网格中的一个格子开始,采用遍历的方式(深度遍历或广度遍历都可以),获取与它相邻的所有数字之差不大于 1 的格子,直到找到所有符合条件的格子,或整个网格中所有的格子都已经遍历完毕,此时,就找到了一个符合条件的区域。
    接下来,从网格中找到下一个(没有遍历过)不在任何区域中的点,以这个点为始点,继续遍历,寻找与它相邻数字不大于 1 的格子,直到找到第二个区域。
    按照相同的方法,找到所有的区域。最后,找出格子最多的区域,输出其格子数。

    需要注意:使用的格子,在下次判断的时候,不应重复统计。


    代码实现

    Java代码

    1. import java.util.Scanner;
    2. /**
    3. * 机器人活动区域
    4. * @since 2023.09.26
    5. * @version 0.1
    6. * @author Frank
    7. *
    8. */
    9. public class RobotMoveArea {
    10. public static void main(String[] args) {
    11. Scanner sc = new Scanner(System.in);
    12. while (sc.hasNext()) {
    13. // 第一行输入一串数字,以空格分隔
    14. String line = sc.nextLine();
    15. String[] rec = line.split(" ");
    16. int rowCnt = Integer.parseInt( rec[0] );
    17. int columnCnt = Integer.parseInt( rec[1] );
    18. int[][] area = new int[rowCnt][columnCnt];
    19. for( int i = 0; i < rowCnt; i ++ )
    20. {
    21. String row = sc.nextLine();
    22. String[] columns = row.split(" ");
    23. for( int j = 0; j < columnCnt; j ++ )
    24. {
    25. area[i][j] = Integer.parseInt( columns[j] );
    26. }
    27. }
    28. processRobotMoveArea( area);
    29. }
    30. }
    31. private static void processRobotMoveArea( int[][] area ) {
    32. int maxPartAreaCnt = 0;
    33. for( int i = 0; i < area.length; i ++ )
    34. {
    35. for( int j = 0; j < area[i].length; j ++ )
    36. {
    37. int cellValue = area[i][j];
    38. if( cellValue == -1 )
    39. {
    40. continue;
    41. }
    42. int partAreaCnt = getPartAraCnt( i, j , area );
    43. if( partAreaCnt > maxPartAreaCnt )
    44. {
    45. maxPartAreaCnt = partAreaCnt;
    46. }
    47. }
    48. }
    49. System.out.println( maxPartAreaCnt );
    50. }
    51. private static int getPartAraCnt( int i, int j, int[][] area ) {
    52. int areaCnt = 0;
    53. int rowCnt = area.length;
    54. int columnCnt = area[0].length;
    55. int cellValue = area[i][j];
    56. area[i][j] = -1;
    57. areaCnt ++;
    58. if( i > 0 && area[i - 1][j] != -1 && Math.abs(cellValue - area[i - 1][j]) <= 1 )
    59. {
    60. areaCnt += getPartAraCnt( i - 1, j, area );
    61. }
    62. if( i < rowCnt - 1 && area[i + 1][j] != -1 && Math.abs(cellValue - area[i + 1][j]) <= 1)
    63. {
    64. areaCnt += getPartAraCnt( i + 1, j, area );
    65. }
    66. if( j > 0 && area[i][j - 1 ] != -1 && Math.abs(cellValue - area[i][j-1]) <= 1) {
    67. areaCnt += getPartAraCnt( i, j - 1, area );
    68. }
    69. if( j < columnCnt - 1 && area[i][j + 1] != -1 && Math.abs(cellValue - area[i][j + 1]) <= 1)
    70. {
    71. areaCnt += getPartAraCnt( i, j + 1, area );
    72. }
    73. return areaCnt;
    74. }
    75. }

    JavaScript代码

    1. const rl = require("readline").createInterface({ input: process.stdin });
    2. var iter = rl[Symbol.asyncIterator]();
    3. const readline = async () => (await iter.next()).value;
    4. void async function() {
    5. while (line = await readline()) {
    6. var rec = line.split(" ");
    7. var rowCnt = parseInt(rec[0]);
    8. var columnCnt = parseInt(rec[1]);
    9. // 第二行数据, 矩形区域
    10. var area = new Array();
    11. for (var i = 0; i < rowCnt; i++) {
    12. line = await readline();
    13. var columns = line.split(" ");
    14. var columnValues = new Array();
    15. for (var j = 0; j < columnCnt; j++) {
    16. columnValues[j] = parseInt(columns[j]);
    17. }
    18. area[i] = columnValues;
    19. }
    20. processRobotMoveArea(area);
    21. }
    22. }();
    23. function processRobotMoveArea(area) {
    24. var maxPartAreaCnt = 0;
    25. for (var i = 0; i < area.length; i++) {
    26. for (var j = 0; j < area[i].length; j++) {
    27. var cellValue = area[i][j];
    28. if (cellValue == -1) {
    29. continue;
    30. }
    31. var partAreaCnt = getPartAraCnt(i, j, area);
    32. if (partAreaCnt > maxPartAreaCnt) {
    33. maxPartAreaCnt = partAreaCnt;
    34. }
    35. }
    36. }
    37. console.log(maxPartAreaCnt);
    38. }
    39. function getPartAraCnt(i, j, area) {
    40. var areaCnt = 0;
    41. var rowCnt = area.length;
    42. var columnCnt = area[0].length;
    43. var cellValue = area[i][j];
    44. area[i][j] = -1;
    45. areaCnt++;
    46. if (i > 0 && area[i - 1][j] != -1 && Math.abs(cellValue - area[i - 1][j]) <= 1) {
    47. areaCnt += getPartAraCnt(i - 1, j, area);
    48. }
    49. if (i < rowCnt - 1 && area[i + 1][j] != -1 && Math.abs(cellValue - area[i + 1][j]) <= 1) {
    50. areaCnt += getPartAraCnt(i + 1, j, area);
    51. }
    52. if (j > 0 && area[i][j - 1] != -1 && Math.abs(cellValue - area[i][j - 1]) <= 1) {
    53. areaCnt += getPartAraCnt(i, j - 1, area);
    54. }
    55. if (j < columnCnt - 1 && area[i][j + 1] != -1 && Math.abs(cellValue - area[i][j + 1]) <= 1) {
    56. areaCnt += getPartAraCnt(i, j + 1, area);
    57. }
    58. return areaCnt;
    59. }

    (完)

  • 相关阅读:
    mybatis-plus实现自定义SQL、多表查询、多表分页查询
    利用vue 及java io流实现浏览器预览docx功能
    Kotlin 开发Android app(十七):用Service推送消息通知
    IP 核之 MMCM/PLL 实验
    数据库编程
    盘点Vue2和Vue3的10种组件通信方式(值得收藏)
    网络-Ajax
    使用 Docker 和 HuggingFace 实现 NLP 文本情感分析应用
    Node学习笔记之使用Express框架开发接口
    客户成功体系如何构建?请看这7步
  • 原文地址:https://blog.csdn.net/ZiJinShi/article/details/133176457