1. 程式人生 > >957. Prison Cells After N Days

957. Prison Cells After N Days

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))