Leetcode 957. N 天后的牢房 迴圈節
阿新 • • 發佈:2018-12-31
題目:
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]
提示:
cells.length == 8
cells[i]
的值為0
或1
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]; } };