华为OD真题学习-查找单入口空闲区域 100

2023-11-11

回溯法:基本做法是搜索,通过x+1、x-1横向遍历,y+1、y-1纵向遍历,获取满足连通的坐标

原始参考链接:【华为OD机试真题 python】查找单入口空闲区域【2022 Q4 | 100分】_无痕de泪的博客-CSDN博客 查找单入口空闲区域 华为OD真题 100_keven000777的博客-CSDN博客

java题解(输入时一次性输入):

import java.util.*;
import java.util.Scanner;

public class test20230131 {
    static int count=0;//入口统计,方便筛选单入口信息

    //入口的坐标信息,如果存在入口,只能是单入口,所以一个长度为2的数组即可
    static int[] entryInfo=new int[2];

    //输入信息:二维数组和数组的x、y
    static String[][] data;
    static int m=0;
    static int n=0;

    public static void main(String[] args){
        Scanner in=new Scanner(System.in);

        String numStr=in.nextLine();
        m=Integer.parseInt(numStr.split(" ")[0]);
        n=Integer.parseInt(numStr.split(" ")[1]);

        data=new String[m][n];
        for(int i=0;i<m;i++){
            String str=in.nextLine();
            String str1[]=str.split(" ");
            for(int j=0;j<n;j++){
                data[i][j]=str1[j];

            }
        }

        int max=0;
        List<int[]> areaDress = new ArrayList<>();   //最大区域的入口坐标和其区域大小的集合
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(data[i][j].equals("O")){
                    //记录每次遍历的入口坐标
                    List<int[]> allList=new ArrayList<>();
                    //遍历完,后面不再遍历,即将O置为X
                    data[i][j]="X";
                    allList.add(new int[]{i,j});

                    findArea(i,j,allList);

                    if(count==1){//通过count==1来筛选单入口区域
                        if(max==allList.size()){//有多种单入口区域大小相同情况,只用输出大小max
                            areaDress.clear();

                        }else if(max<allList.size()){
                            //获取单入口的最大区域
                            max=allList.size();
                            areaDress.clear();
                            areaDress.add(new int[]{entryInfo[0],entryInfo[1],max});
                        }
                    }
                    //下一个坐标遍历时,重置数据;
                    count=0;
                    entryInfo=new int[2];
                }
            }

        }
        //单入口里面坐标及大小
        if(areaDress.size()==1){
            System.out.println(areaDress.get(0)[0]+" "+areaDress.get(0)[1]+" "+areaDress.get(0)[2]);
        }else if(max!=0){//quyu为空时,存在max!=0,即存在重复大小的单入口区域
            System.out.println(max);
        }else {//不存在单入口区域
            System.out.println("NULL");
        }
    }

    //递归遍历x+1或y+1区域,寻找连通区域
    public static void findArea(int x,int y,List<int[]> allList){
        //边界入口:
        if(x==0 || x==m-1 || y==0 || y==n-1){
            count++;//入口统计
            //获取入口坐标信息
            entryInfo[0]=x;
            entryInfo[1]=y;
        }

        if(x<m-1){
            if(data[x+1][y].equals("O")){
                data[x+1][y]="X";
                allList.add(new int[]{x+1,y});
                findArea(x+1,y,allList);
            }
        }

        if(y<n-1){
            if(data[x][y+1].equals("O")){
                data[x][y+1]="X";
                allList.add(new int[]{x,y+1});
                findArea(x,y+1,allList);
            }
        }
        if(x-1>=0){
            if(data[x-1][y].equals("O")){
                data[x-1][y]="X";
                allList.add(new int[]{x-1,y});
                findArea(x-1,y,allList);
            }
        }
        if(y-1>=0){
            if(data[x][y-1].equals("O")){
                data[x][y-1]="X";
                allList.add(new int[]{x,y-1});
                findArea(x,y-1,allList);
            }
        }
    }
}

//另外:data[x][y+1].equals("O")不能写成data[x][y+1]=="O";做题细节要注意

python题解:

#相关全局变量
str=input()

m=int(str.split(" ")[0])
n=int(str.split(" ")[1])
#data接收输入的X、O数据
data=[]
for i in range(m):
    str1=input()
    data1=[]
    for j in range(n):
        data1.append(str1.split(" ")[j])
    data.append(data1)

Max=0
count=0
#存储入口坐标
entryInfo=[0,0]

#存储坐标加连通区域大小
allData=[]

def gainDataAdress(x, y,areaDress):
    if(x==0 or x==m-1 or y==0 or y==n-1):
        global count
        count+=1
        #获取坐标
        entryInfo[0]=x
        entryInfo[1]=y

    if(x<m-1):
        if(data[x+1][y]=="O"):
            data[x+1][y]="X"
            listreData=[x+1,y]
            areaDress.append(listreData)
            gainDataAdress(x+1,y,areaDress)    

    if (y < n - 1):
        if (data[x][y+1] == "O"):
            data[x][y+1] = "X"
            listreData=[x,y+1]
            areaDress.append(listreData)
            gainDataAdress(x, y+1, areaDress)
            
    if(x-1>=0):
        if(data[x-1][y]=="O"):
            data[x-1][y]="X"
            listreData=[x-1,y]
            areaDress.append(listreData)
            gainDataAdress(x-1,y,areaDress)
    if(y-1>=0):
        if(data[x][y-1]=="O"):
            data[x][y-1]="X"
            listreData=[x,y-1]
            areaDress.append(listreData)
            gainDataAdress(x,y-1,areaDress)


for p in range(m):
    for q in range(n):
        if(data[p][q]=="O"):
            areaDress = []
            areaDress.append([p,q])
            data[p][q]="X"
            gainDataAdress(p,q,areaDress)
            #单入口区域
            if(count==1):
                #存在多个单入口区域
                if(Max==len(areaDress)):
                    allData.clear()
                elif(Max<len(areaDress)):
                    Max=len(areaDress)
                    allData.clear()
                    allData.append(entryInfo+[Max])
            count=0
            entryInfo=[0,0]

if(len(allData)==1):
    print(allData[0][0],allData[0][1],allData[0][2])
elif(Max!=0):
    print(Max)
else:
    print("NULL")

欢迎指正,未完待续~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

华为OD真题学习-查找单入口空闲区域 100 的相关文章

随机推荐

  • Source Insight 4.0安装教程(PS:附安装包及卸载重新安装等注意事项)

    目录 一 Source Insight 4 0安装包 二 删除配置文件 初次安装忽略此步骤 1 清除注册表信息 2 删除全局配置信息 三 安装步骤 1 解压 2 安装 3 替换 4 破解 5 安装提示unable to open or cr
  • windows10 中英文切换状态无法显示解决办法

    菜鸟的电脑很早之前就有这个中英文状态无法显示的毛病 菜鸟一只想解决 但是没有去弄 前几天 菜鸟发现下载一个其他输入法 电脑自带的输入法的中英文切换就会自己出来 但是好景不长 这是治标不治本 今天菜鸟电脑又显示不出来中英文切换了 于是上网搜索
  • STM32程序死在HardFault_Handler的分析和解决

    最近开发STM32F070F6P6项目 发现程序老是运行不了 仿真发现 程序总是死在HardFault Handler 程序总是死在第二个初始化函数里面 上网查询资料发现 STM32出现HardFault Handler故障的原因主要有两个
  • 中国的互联网技术有多牛逼?

    中国的电商 网约车 共享单车 外卖等都居于全球第一 物流配送效率全球第一 表面上看起来这些都是互联网技术 在全球居于领先地位 然而古怪的是至今为止中国互联网唯一走向世界的只有Tik Tok 在中国以外的市场 互联网还是由谷歌 亚马逊等美国企
  • Web自动化测试流程:从入门到精通,帮你成为测试专家!

    Web应用程序在今天的软件开发中占据着越来越重要的地位 保证Web应用程序的质量和稳定性是非常必要的 而自动化测试是一种有效的方法 本文将介绍Web自动化测试流程 并提供代码示例 步骤一 选取测试工具 选择适合自己团队的自动化测试工具是很重
  • 如何生成1亿个手机号码?Python来教你。真实的面试题哦。

    案例解析 最近在网上看到一个python的面试题目 如何用Python生成1亿个手机号码 我第一眼看到的时候心想 这个还不简单 直接 random randint 1 999999999999 就完事了 但是马上就发现了这其中的错误 这个是
  • sql注入系列之Sqli-labs(less-8)

    判断注入点 http 192 168 81 210 sqli Less 8 id 1 id等于1的时候正常id等于1 的时候页面有改变 因此可以判断可能存在注入 并且是布尔型盲注 判断注入类型 输入1 and 1 1和1 and 1 2发现
  • MySQL字符串截取:左截取、右截取、按关键字截取

    1 从左开始截取字符串 语法 SELECT LEFT str len str 被截取的字符串 len 截取长度 示例 SELECT LEFT TF 8220210412003 1 10 结果为 TF 8220210 2 从右开始截取字符串
  • python使用matplotlib创建三维图时隐藏坐标轴、网格、背景的方法

    使用下面的代码创建一条空间直线 import numpy as np import matplotlib pyplot as plt 创建一个空白画布 fig plt figure 创建一个子图 ax fig add subplot pro
  • [-] \Navicat-Cracker NavicatCrackerDlg.cpp:463 ->Please Patch first Or Specified RSA private key

    报错信息 Navicat Cracker NavicatCrackerDlg cpp 463 gt hinese Can t Generate Activation Code Keygen HINT Please Patch first O
  • 【Mo 人工智能技术博客】文本挖掘之LDA主题模型

    文本挖掘之LDA主题模型 作者 郑培 引言 主题模型是文本挖掘的重要工具 近年来在工业界和学术界都获得了非常多的关注 在文本挖掘领域 大量的数据都是非结构化的 很难从信息中直接获取相关和期望的信息 一种文本挖掘的方法 主题模型 Topic
  • ReLU,Sigmoid,Tanh,softmax,pipeline【基础知识总结】

    一 ReLU Rectified Linear Activation Function 1 优点 2 缺点 3 补充 1 Leaky ReLUs 2 参数化修正线性单元 PReLU 3 随机纠正线性单元 RReLU 二 Sigmoid 1
  • echarts自适应父级盒子宽度

    这里写自定义目录标题 效果 手动改变窗口大小 echarts实现自动适应父级盒子宽度 1 在vue中安装一个插件element resize detector 这是一个元素调整大小检测器 npm install element resize
  • 微观的C/C++编译执行过程

    前言 相信能看到这篇文章的同学 是对C语言很热爱的人 最开始学习C语言的时候 我们大多数人都是用集成开发环境 VS VC devc 等 当我们把C语言源代码写好了之后 在集成开发工具中这里点一下 哪里点一下 代码就跑起来了 这种快乐的感觉的
  • Linux下node-sass安装失败的解决方法与简单使用

    记录一下安装node sass的过程 关于CSS是不是一门编程语言 这里不讨论 但是它没有变量 语句 函数 反正我觉得他不是编程语言 于是程序员们发明了CSS预处理器 css preprocessor 它是一种专门的编程语言 可以使用你会的
  • java经典算法题

    目录 1 Java多线程 写一下两个线程交替打印 0 100 的奇偶数 2 线程安全的单例模式 3 用两个栈实现队列 4 实现单链表反转操作 5 Java实现二分查找 6 冒泡排序 7 快速排序 快速排序的基本思想 8 Java单链表实现快
  • 类的设计方法

    1 类名首字母应该大写 字段 方法以及对象 句柄 的首字母应小写 对于所有标识符 其中包含的所有单词都应紧靠在一起 而且大写中间单词的首字母 例如 ThisIsAClassNamethisIsMethodOrFieldName若在定义中出现
  • vue中页面分页引导

    一 使用driver js做页面分页引导 default 先来看看默认引导的效果 可以根据自己的需求做页面样式上的修改 change 修改修改如下 移动端web端都可以用 接下来说一下具体的用法 1 npm 安装 npm install d
  • EsayExcel使用

    EsayExcel简单入门 1 maven依赖
  • 华为OD真题学习-查找单入口空闲区域 100

    回溯法 基本做法是搜索 通过x 1 x 1横向遍历 y 1 y 1纵向遍历 获取满足连通的坐标 原始参考链接 华为OD机试真题 python 查找单入口空闲区域 2022 Q4 100分 无痕de泪的博客 CSDN博客 查找单入口空闲区域