C++實現N天后監獄牢房的狀態


假設有一排8個監獄牢房,每個牢房裡要麼關押著犯人,要麼是空的。每天,牢房的佔用狀態都會根據以下規則發生變化:

  • 如果一個牢房的兩個相鄰鄰居都有人居住或都空著,則該牢房有人居住。

  • 否則,它就空著。

我們將以如下方式描述監獄的當前狀態:如果第i個牢房有人居住,則cells[i]為1,否則cells[i]為0。

因此,我們有監獄的初始狀態,然後返回N天后的監獄狀態。

例如,如果輸入為:[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]

為了解決這個問題,我們將遵循以下步驟:

  • 建立一個對映m,並建立一個名為visited的集合。

  • 如果N為0,則返回cells

  • 將cells插入到visited集合中

  • 對於範圍1到14內的i

    • 建立一個大小為8的陣列temp

    • 對於範圍1到6內的j

      • 如果cells[j – 1] XOR cells[j + 1] = 0,則temp[j] := 1

    • cells := temp

    • m[i] := temp

    • 將temp插入到visited中

  • 如果N能被14整除,則返回m[14],否則返回m[N mod 14]

讓我們看看下面的實現來更好地理解:

示例

線上演示

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<int> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
   public:
   vector<int> prisonAfterNDays(vector<int>& cells, int N) {
      map <int, vector <int> > m;
      if(N == 0) return cells;
      set <vector <int> > visited;
      visited.insert(cells);
      for(int i = 1; i<=14 ; i++ ){
         vector <int> temp(8);
         for(int j = 1; j < 7; j++){
            if(cells[j - 1] ^ cells[j + 1] == 0){
               temp[j] = 1;
            }
         }
         cells = temp;
         m[i] = temp;
         visited.insert(temp);
      }
      return m[N % 14 == 0? 14 : N % 14];
   }
};
main(){
   vector<int> v1 = {0,1,0,1,1,0,0,1};
   Solution ob;
   print_vector(ob.prisonAfterNDays(v1, 7));
}

輸入

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

輸出

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

更新於:2020年4月30日

瀏覽量:395

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.