31.火星改造、宜居星球改造计划--队列--OD

文章描述了一种算法,用于分析火星大气改造过程中的网格,判断是否能将所有可改造区域转变为宜居区,以及计算所需最短天数。通过逐个转换周边的NO区域,直到没有可改造区域为止。
摘要由CSDN通过智能技术生成
# 2030年,人类通过火星的大气进行改造,使得火星适宜居住
# 由于技术原因,无法一次进行改造,只能通过局部处理形式,
# 假设待改造区域row * col 的网格有3个值,宜居区,可改造区,死亡区,使用YES、NO、NA代替
#
# YES表示该网格已经完成改造
# NO表示该网格未进行改造,后期可进行改造
# NA表示死亡区,无法穿越
#
# 初始化状态该区域可能存在多个宜居区,并且每个宜居区每个太阳日都可以向上下左右四个方向进行改造
# 请计算是否可以将这个待改造区域全部改造成宜居区,如果可以输出改造天数,如果不可以返回-1
# YES YES NO
# NO NO NO
# YES NO NO
#
# 输出:2
#
# YES NO NO NO
# NO NO NO NO
# NO NO NO NO
# NO NO NO NO
#
# 输出:6

#
# YES NO NO YES
# NO NO YES NO
# NO YES NA NA
# YES NO NA NO
# 输出: -1


from queue import Queue

inputList = []
while True:
    line = input()
    if line:
        inputList.append(line)
    else:
        break


rows = len(inputList)
cols = len(inputList[0].split())
gridCopy = [[None] * cols for _ in range(rows)]
noNums = 0

q = Queue()  # 先进先出队列
for i in range(rows):
    strings = inputList[i].split()

    gridCopy[i] = strings[:cols]
    noNums += strings.count("NO")
    for j in range(cols):
        if gridCopy[i][j] == "YES":
            q.put((i, j))

day = 0

while not q.empty() and noNums != 0:
    size = q.qsize()

    for _ in range(size):
        i, j = q.get()  # 调用get()方法,移除并获取队列的第一个元素
        directions = [[-1, 0], [1, 0], [0, -1], [0, 1]]
        for dir in directions:
            newRow = i + dir[0]
            newCol = j + dir[1]
            if (
                0 <= newRow < rows
                and 0 <= newCol < cols
                and gridCopy[newRow][newCol] == "NO"
            ):
                gridCopy[newRow][newCol] = "YES"
                noNums -= 1
                q.put((newRow, newCol))

    day += 1

print(day) if noNums == 0 else print(-1)


  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值