用Python编写查找k天后囚室状态的程序

用Python编写查找k天后囚室状态的程序

假设我们有一个二进制列表(列表中的1和0)和另一个值k。其中nums中的每个值表示一间监狱的状态,其中1表示占用,0表示空置。当一个单元格有两个相邻单元格同时为空或占用时,它将变为占用状态。否则,它将变为空置的。因此,我们要找到k天之后囚室的状态。

因此,如果输入为nums = [1, 0, 1, 0, 0, 0, 0, 0] k = 1, 则输出为[0, 1, 1, 0, 1, 1, 1, 0],因为我们可以注意到第一个和最后一个索引永远不能被占用,因为它们永远不能有2个邻居。

为了解决这个问题,我们将采取以下步骤:

  • 定义函数next_day_state()。这将以单元格为输入。
  • new_cells:单元格的副本
  • new_cells [0]=0,new_cells [7]=0
  • 对于范围在1到6之间的j,执行以下操作:
    • 如果cells [j-1]与cells [j + 1]相同,则
      • new_cells[j]:= 1
    • 否则,
      • new_cells[j]:= 0
  • 返回new_cells
  • 从main方法执行以下操作:
  • seen:=一个新的映射
  • flag:=False, i:=0
  • 当i小于N时,执行以下操作:
    • ns:=next_day_state(cells)
    • 如果没有看见ns,则
      • 将ns标记为已看过
    • 否则,
      • flag:=True
      • 从循环中退出
  • cells:=ns
  • i:=i+1
    • 如果flag为true,则
  • N:=N mod(已观察到的项数)

  • i:=0
  • 当i

    • ns:=next_day_state(cells)
    • i:=i+1
    • cells:=ns

    • 返回cells

让我们看以下实现以更好地理解:

更多Python相关文章,请阅读:Python 教程

示例

import copy
class Solution:
   def next_day_state(self, cells):
      new_cells = copy.copy(cells)
      new_cells[0] = 0
      new_cells[7] = 0
      for j in range(1, 7):
         if cells[j - 1] == cells[j + 1]:
            new_cells[j] = 1
         else:
            new_cells[j] = 0
      return new_cells

   def solve(self, cells, N):
      seen = dict()
      flag, i = False, 0

      while i < N:
         ns = self.next_day_state(cells)
         if tuple(ns) not in seen:
            seen[tuple(ns)] = True
         else:
            flag = True
            break
         cells = ns
         i += 1

      if flag:
         N = N % len(seen)
         i = 0
         while i < N:
            ns = self.next_day_state(cells)
            i += 1
            cells = ns
      return cells

ob = Solution()
nums = [1, 0, 1, 0, 0, 0, 0, 0]
k = 1
print(ob.solve(nums, k))

输入

[4, 7, 2, 5], 6

输出

[0, 1, 1, 0, 1, 1, 1, 0]

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程