1. 程式人生 > >Leetcode 957. N 天后的牢房 迴圈節

Leetcode 957. N 天后的牢房 迴圈節

題目:

8 間牢房排成一排,每間牢房不是有人住就是空著。

每天,無論牢房是被佔用或空置,都會根據以下規則進行更改:

  • 如果一間牢房的兩個相鄰的房間都被佔用或都是空的,那麼該牢房就會被佔用。
  • 否則,它就會被空置。

(請注意,由於監獄中的牢房排成一行,所以行中的第一個和最後一個房間無法有兩個相鄰的房間。)

我們用以下方式描述監獄的當前狀態:如果第 i 間牢房被佔用,則 cell[i]==1,否則 cell[i]==0

根據監獄的初始狀態,在 N 天后返回監獄的狀況(和上述 N 種變化)。

 

示例 1:

輸入:cells = [0,1,0,1,1,0,0,1], N = 7
輸出:[0,0,1,1,0,0,0,0]
解釋:
下表概述了監獄每天的狀況:
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]

示例 2:

輸入:cells = [1,0,0,1,0,0,1,0], N = 1000000000
輸出:[0,0,1,1,1,1,1,0]

 

提示:

  1. cells.length == 8
  2. cells[i] 的值為 01 
  3. 1 <= N <= 10^9

思路:

因為有8間房子,每間有兩種情況,所以一共有2^8即256種情況。所以只需要求出序列的迴圈節即可。

就是將某天的牢房x與前幾天的比較,如果與某天t相同則不需要往下找了,求出週期T=t-x,並記下那一天的位置t,則n天的牢房情況即為(n-t)%T+t;

程式碼如下:

class Solution {
public:
    vector<int> prisonAfterNDays(vector<int>& cells, int N) {
          vector<vector<int> >v;
            vector<int>temp;
          for (int i=0;i<8;i++)
          {
              temp.push_back(cells[i]);
          }
            v.push_back(temp);
          int t=1,s;
          for (int i=1;i<=256;i++)
          {
              vector<int>temp;
              for (int j=0;j<8;j++)
              {
                  
                  if(j&&j!=7&&v[i-1][j-1]==v[i-1][j+1])
                      temp.push_back(1);
                  else 
                      temp.push_back(0);
              }
              v.push_back(temp);
              int flag1=0;
              for (int j=0;j<i;j++)
              {
                int flag=0;
                for (int k=0;k<8;k++)
                {
                    if(v[j][k]!=v[i][k])
                    {
                        flag=1;
                         break;
                    }
                }
                if(flag==0)
                {
                    flag1=1;
                    s=j;
                    t=i-s;
                    break;
                }
              }
              if(flag1)
              {
                  break;
              }
          }
        if(N<=s)
            return v[N];
        else
          return v[(N-s)%t+s];
    }
};