【宜居星球改造计划】Python 实现

1.题目

2XXX年,人类通过对火星的大气进行宜居改造分析,使得火星已在理论上具备人类宜居的条件,由于技术原因,无法一次性将火星大气全部改造,只能通过局部处理形式,假设将火星待改造的区域为row*column的网格每个网格有3个值,宜居区、可改造区、死一区,使用YES、NO、NA代替,YES表示该网格已经完成大气改造,NO表示该网格未进行改造,后期可进行改造,NA表示死亡区,不作为判断是否改造完成的宜居,无法穿过初始化只下,该区域可能存在多人官居区,并日每人官居区能同时在每人大阳日单位向上下左右四人方向的相邻格子进行扩散,自动将4个方向相邻的真空区改造成宜居区;请计算这个待改造区域的网格中,可改造区是否能全部变成宜居区,如果可以,则返回改造的太阳日天数,不可以则返回-1。
输入描述:
输入row * column个网格数据Q,每个网格值枚举值如下: YES,NO,NA,样例:YES YES NO
NO NO NO
NA NO YES
输出描述:
可改造区是否能全部变成宜居区,如果可以,则返回改造的太阳日天数,不可以则返回-1.
补充说明:
gridi只有3种情况,YES、NO、NA
row == grid.length, column == gridlil.length, 1 <= row, column <= 8

示例1
输入:

YES YES NO
NO NO NO
YES NO NO
输出:
说明: 经过2个太阳日,完成宜居改造

示例2
输入:

YES NO NO NO
NO NO NO NO
NO NO NO NO
NO NO NO NO
输出:
说明: 经过6个太阳日,可完成改造

示例3
输入:

NO NA
输出:
说明:无改造初始条件,无法进行改造

示例4
输入:

YES NO NO YES
NO NO YES NO
NO YES NA NA
YES NO NA NO
输出:
说明: 右下角的区域,被周边三个死亡区挡住,无法实现改造

2.解题思路

这道题目要求你确定一个火星网格区域是否可以通过一系列操作,将所有的可改造区域变成宜居区域,并计算完成这个任务所需的太阳日的天数

  • YES 表示宜居区,表示这个区域已经改造成适合人类居住的状态。
  • NO 表示可改造区,这些区域还没有改造成宜居区,但可以通过一系列操作逐渐改造。
  • NA 表示死亡区,这些区域无法改造成宜居区,不考虑在内。

接下来,我们来解释上下左右的动作

在这个问题中,人类可以站在宜居区域,并朝上下左右四个方向之一移动,将相邻的可改造区域改造成宜居区域。换句话说,人类可以从一个宜居区域向四个方向扩展改造工作,直到无法再继续改造或者所有可改造区域都已改造成宜居区域。

Q1. YES值表示宜居区吗?上下左右的动作是什么值发起的?
YES 值表示宜居区,上下左右的动作表示人类站在一个宜居区域,然后可以选择向上、下、左、右四个方向之一扩展改造工作,将相邻的可改造区域改造成宜居区域。这些动作帮助人类逐步改造整个区域,直到所有可改造区域都变成宜居区域,或者无法再继续改造为止。

Q2.什么是太阳日天数? 有几个yes,就表示一天有几个人,各发起一次上/下/左/右四个方向之一的改造工作吗?
太阳日天数是指完成火星上的大气改造所需的时间,这个时间单位可以理解为一天。在这个问题中,每个YES表示一个宜居区,但不代表一定有一个人,而是表示这个区域已经改造成适合人类居住的状态。然后,每个人可以站在一个宜居区,朝上、下、左、右四个方向之一移动,将相邻的可改造区域改造成宜居区域。所以,如果有多个宜居区域,那么每个宜居区域上都可以有一个人,他们可以同时发起上、下、左、右四个方向之一的改造工作,但每个人只能改造一个方向的区域。

太阳日天数表示在每个太阳日(一天)内,人们可以进行一系列改造操作,然后计算需要多少天才能将所有的可改造区域变成宜居区域。

3.代码

代码思路:

  1. 遍历整个网格,找到所有可改造区(NO)。
  2. 对于每个可改造区,检查其上下左右相邻的格子是否为宜居区(YES),如果是,则将该格子标记为宜居区。
  3. 记录需要改造的格子数量,如果可改造区全部变成宜居区,则返回改造的太阳日天数,否则返回-1。
'''
1.livable_days函数接收一个二维列表grid作为输入,表示待改造区域的网格数据。
2.directions变量存储了上下左右四个方向的偏移量。
3.visited变量用于记录每个格子是否已经访问过,避免重复访问。
4.dfs函数用于深度优先搜索,将可改造区周围的宜居区标记为宜居区。
5.遍历整个网格,找到所有可改造区,然后使用dfs函数进行改造。
6.如果所有可改造区都变成了宜居区,则返回改造的太阳日天数,否则返回-1。
'''
def livable_days(grid):rows, cols = len(grid), len(grid[0])directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]visited = [[False for _ in range(cols)] for _ in range(rows)]days = 0def dfs(x, y):nonlocal days# 检查当前格子是否在网格范围内、是否已经访问过以及是否被标记为不可通行('NA')# 如果是任何一种情况,就返回,否则标记当前格子为已访问。if not (0 <= x < rows and 0 <= y < cols) or visited[x][y] or grid[x][y] == 'NA':returnvisited[x][y] = True# 在四个方向上尝试移动,如果邻近格子是可通行的('NO'),# 则递归调用dfs函数来继续探索这个格子的连通区域。for dx, dy in directions:nx, ny = x + dx, y + dyif 0 <= nx < rows and 0 <= ny < cols and grid[nx][ny] == 'NO':dfs(nx, ny)# 在两个嵌套的循环中,遍历整个网格。如果发现一个未访问过的不可通行格子('NO'),# 就增加days计数并启动DFS来探索与该格子相连的所有不可通行格子。for i in range(rows):for j in range(cols):if grid[i][j] == 'NO' and not visited[i][j]:days += 1dfs(i, j)# 如果网格中所有的格子都已经被标记为可通行('YES'),则返回已经过的天数days,# 否则返回-1,表示无法使整个网格变得全通行。return days if all(grid[i][j] == 'YES' for i in range(rows) for j in range(cols)) else -1'''
# 示例1
grid1 = [['YES', 'YES', 'NO'],['NO', 'NO', 'NO'],['YES', 'NO', 'NO']]print(livable_days(grid1))  # 输出:2# 示例2
grid2 = [['YES', 'NO', 'NO', 'NO'],['NO', 'NO', 'NO', 'NO'],['NO', 'NO', 'NO', 'NO'],['NO', 'NO', 'NO', 'NO']]
print(livable_days(grid2))  # 输出:6# 示例3
grid3 = [['NO', 'NA'],['NA', 'NA']]
print(livable_days(grid3))  # 输出:-1# 示例4
grid4 = [['YES', 'NO', 'NO', 'YES'],['NO', 'NO', 'YES', 'NO'],['NO', 'YES', 'NA', 'NA'],['YES', 'NO', 'NA', 'NO']]
print(livable_days(grid4))  # 输出:-1
'''

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/70154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

npm设置国内源(淘宝镜像源),解决npm包下载速度慢的问题

前景提要 因为众所周知的原因&#xff0c;我们从拉取从官方源拉取npm 依赖&#xff0c;经常容易出现超时&#xff0c;拉取失败的情况。这个时候我们就非常有必要切换使用国内源了&#xff0c;如淘宝源等 临时使用 npm --registry https://registry.npm.taobao.org install X…

【vue2第十五章】VueRouter 路由配置(VueRouter)与使用 和 router-link与router-view标签使用

单页面应用 与 多页面应用 单页面应用&#xff08;Single-Page Application&#xff0c;SPA&#xff09;和多页面应用&#xff08;Multi-Page Application&#xff0c;MPA&#xff09;是 Web 应用程序的两种不同架构方式。它们在页面加载和交互方式上有所区别。 单页面应用&a…

GitHub个人访问凭证在哪看

要查看 GitHub 个人访问凭证&#xff08;Personal Access Token&#xff09;&#xff0c;请按照以下步骤进行操作&#xff1a; 登录到你的 GitHub 帐户。点击右上角的头像&#xff0c;然后选择 “Settings”&#xff08;设置&#xff09;。在左侧导航栏中&#xff0c;选择 “D…

iOS 17中的Safari配置文件改变了游戏规则,那么如何设置呢

Safari在iOS 17中最大的升级是浏览配置文件——能够在一个应用程序中创建单独的选项卡和书签组。这些也可以跟随你的iPad和Mac&#xff0c;但在本指南中&#xff0c;我们将向你展示如何使用运行iOS 17的iPhone。 你可能有点困惑&#xff0c;为什么Safari中没有明显的位置可以添…

【洛谷 P1328】[NOIP2014 提高组] 生活大爆炸版石头剪刀布 题解(模拟+向量)

[NOIP2014 提高组] 生活大爆炸版石头剪刀布 题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样&#xff0c;则不分胜负。在《生活大爆炸》第二季第 8 集中出现了一种石头剪刀布的升级版游戏。 升级版游戏在传统的石头剪刀布游戏的基础…

d435i 相机和imu标定

一、IMU 标定 使用 imu_utils 功能包标定 IMU&#xff0c;由于imu_utils功能包的编译依赖于code_utils&#xff0c;需要先编译code_utils&#xff0c;主要参考 相机与IMU联合标定_熊猫飞天的博客-CSDN博客 Ubuntu20.04编译并运行imu_utils&#xff0c;并且标定IMU_学无止境的…

函数栈帧(详解)

一、前言&#xff1a; 环境&#xff1a;X86Vs2013 我们C语言学习过程中是否遇到过如下问题或者疑惑&#xff1a; 1、局部变量是如何创建的&#xff1f; 2、为什么局部变量的值是随机值&#xff1f; 3、函数是怎么传参的&#xff1f;传参的顺序是怎样的&#xff1f; 4、形…

【群智能算法改进】一种改进的鹈鹕优化算法 IPOA算法[1]【Matlab代码#57】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. 原始POA算法2. 改进后的IPOA算法2.1 Sine映射种群初始化2.2 融合改进的正余弦策略2.3 Levy飞行策略 3. 部分代码展示4. 仿真结果展示5. 资源获取 【获取资源请见文章第5节&#xff1a;资源获取】 1. 原始POA算法 此…

vue中属性执行顺序

vue中属性的执行顺序 在Vue 2中&#xff0c;组件的生命周期和数据绑定的执行顺序如下&#xff1a; data&#xff1a;首先&#xff0c;组件会调用 data 函数&#xff0c;该函数返回一个对象&#xff0c;该对象的属性和方法会被分配给组件的 $data。init&#xff1a;接下来&…

10 种常用的字符串方法

10 种常用的字符串方法 1.concat() 字符串拼接 const str1 12345678;const str2 abcdefgh;const str3 -【】&#xff1b;‘;console.log(str1.concat(str2,str3))//12345678abcdefgh-【】&#xff1b;‘ 2.includes() 判断字符串中是否包含指定值&#xff0c;返回布尔值…

Gartner发布中国科技报告:数据编织和大模型技术崭露头角

近日&#xff0c;全球知名科技研究和咨询机构Gartner发布了关于中国数据分析与人工智能技术的最新报告。报告指出&#xff0c;中国正迎来数据分析与人工智能领域的蓬勃发展&#xff0c;预计到2026年&#xff0c;将有超过30%的白领工作岗位重新定义&#xff0c;生成式人工智能技…

多线程应用——线程池

线程池 文章目录 线程池1.什么是线程池2.为什么要用线程池3.怎么使用线程池4.工厂模式5.自己实现一个线程池6.创建系统自带的线程池6.1 拒绝策略6.2 线程池的工作流程 1.什么是线程池 字面意思&#xff0c;一次创建多个线程&#xff0c;放在一个池子(集合类)&#xff0c;用的时…

Spring Cloud Gateway集成sentinel进行网关限流

本文目录 1.引入pom2.Gateway模块yaml添加配置3.自定义流控异常4.Sentinel网关流控控制台1.网关流控规则介绍2.API管理介绍3.熔断规则4.系统规则本文使用版本如下: <spring.boot.version>3.1.0</spring.boot.version><spring.cloud.version>

f12工具

抓包工具 elements查看器&#xff1a; 可用于自动化脚本的元素定位,前端页面-html页面 Selenium提供了八种定位元素方式 1、id 2、name 3、class_name 4、tag_name 5、link_text 6、partial_link_text 7、XPath(倾向于用相对路径&#xff1a;//input【name“phone”】…

1.springboot 集成elasticsearch组件

1.前置条件已经安装和搭建好了elasticsearch中间件 一&#xff1a;项目中引入elasticsearch相关依赖 我安装的elasticsearch版本是7.10.2 对应依赖的版本保持一致 此处省略springboot 搭建及必要的依赖项 <dependency><groupId>org.elasticsearch.client</group…

华为OD机考算法题:根据某条件聚类最少交换次数

目录 题目部分 解读与思路 代码实现 题目部分 题目根据某条件聚类最少交换次数题目说明给出数字K&#xff0c;请输出所有结果小于K的整数组合到一起的最少交换次数。 组合一起是指满足条件的数字相邻&#xff0c;不要求相邻后在数组中的位置。 数据范围 -100 <K < 10…

深度学习模型调参经验

调参经验&#xff1a; 1.Seed在小数据集上有着重要作用&#xff0c;用于参数初始化&#xff0c;可以选取合适的seed。 2.确定epoch&#xff0c;是根据损失函数的值&#xff0c;画出损失函数曲线图&#xff0c;人工确认或者运用早停法。进而再确定auc。 3.batch_size在大数据…

如何将枯燥的大数据进行可视化处理?

在数字时代&#xff0c;大数据已经成为商业、科学、政府和日常生活中不可或缺的一部分。然而&#xff0c;大数据本身往往是枯燥的、难以理解的数字和文字&#xff0c;如果没有有效的方式将其可视化&#xff0c;就会错失其中的宝贵信息。以下是一些方法&#xff0c;可以将枯燥的…

BRAM/URAM资源介绍

BRAM/URAM资源简介 Bram和URAM都是FPGA&#xff08;现场可编程门阵列&#xff09;中的RAM资源。 Bram是Block RAM的缩写&#xff0c;是Xilinx FPGA中常见的RAM资源之一&#xff0c;也是最常用的资源之一。它是一种单独的RAM模块&#xff0c;通常用于存储大量的数据&#xff0…

xctf攻防世界 MISC之CatFlag

0x01.进入环境&#xff0c;下载附件 拿到的是一个无后缀的flag文件&#xff0c;用winhex打开后发现是奇奇怪怪的乱码&#xff0c;用kali的strings搜索也没找到flag情况。 0x02.问题分析 题目提示如图&#xff1a; 让直接cat就行&#xff0c;在kali中直接尝试输入&#xff1a…