957. Prison Cells After N Days

本文介绍了一个基于特定规则的监狱细胞状态模拟算法。在一个由8个细胞组成的行中,每个细胞的状态(占用或空置)每天根据相邻细胞的状态变化。通过发现状态变化的周期性,算法高效地预测了N天后的细胞状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

There are 8 prison cells in a row, and each cell is either occupied or vacant.

Each day, whether the cell is occupied or vacant changes according to the following rules:

  • If a cell has two adjacent neighbors that are both occupied or both vacant, then the cell becomes occupied.
  • Otherwise, it becomes vacant.

(Note that because the prison is a row, the first and the last cells in the row can't have two adjacent neighbors.)

We describe the current state of the prison in the following way: cells[i] == 1 if the i-th cell is occupied, else cells[i] == 0.

Given the initial state of the prison, return the state of the prison after N days (and N such changes described above.)

 

Example 1:

Input: cells = [0,1,0,1,1,0,0,1], N = 7
Output: [0,0,1,1,0,0,0,0]
Explanation: 
The following table summarizes the state of the prison on each day:
Day 0: [0, 1, 0, 1, 1, 0, 0, 1]
Day 1: [0, 1, 1, 0, 0, 0, 0, 0]
Day 2: [0, 0, 0, 0, 1, 1, 1, 0]
Day 3: [0, 1, 1, 0, 0, 1, 0, 0]
Day 4: [0, 0, 0, 0, 0, 1, 0, 0]
Day 5: [0, 1, 1, 1, 0, 1, 0, 0]
Day 6: [0, 0, 1, 0, 1, 1, 0, 0]
Day 7: [0, 0, 1, 1, 0, 0, 0, 0]

Example 2:

Input: cells = [1,0,0,1,0,0,1,0], N = 1000000000
Output: [0,0,1,1,1,1,1,0]

 

Note:

  1. cells.length == 8
  2. cells[i] is in {0, 1}
  3. 1 <= N <= 10^9

思路:最多也就2^8种可能,一定有周期的。唯一要注意的就是在进入周期循环前可能又有一段启动的步骤

class Solution(object):
    def prisonAfterNDays(self, cells, N):
        """
        :type cells: List[int]
        :type N: int
        :rtype: List[int]
        """
        N-=1
        cells[1:7] = [1 if cells[j-1]==cells[j+1] else 0  for j in range(1,7)]
        cells[0]=cells[-1]=0
        
        vis={''.join(list(map(str,cells))):0}
        i=1
        while i<N+1:
            cells[1:7] = [1 if cells[j-1]==cells[j+1] else 0  for j in range(1,7)]
            if ''.join(list(map(str,cells))) in vis: break
            vis[''.join(list(map(str,cells)))] = i
            i+=1
        
        if i==N+1: return cells
        peroid = i-vis[''.join(list(map(str,cells)))]
        start = vis[''.join(list(map(str,cells)))]
        N-=start
        N%=peroid
        for i in range(N):
            cells[1:7] = [1 if cells[j-1]==cells[j+1] else 0  for j in range(1,7)]
        return cells
    
    
s=Solution()
print(s.prisonAfterNDays(cells = [1, 1, 0, 1, 1, 0, 1, 1], N = 6))
print(s.prisonAfterNDays(cells = [0,1,0,1,1,0,0,1], N = 7))
print(s.prisonAfterNDays(cells = [1,0,0,1,0,0,1,0], N = 1000000000))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值