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

开启你的职业生涯

完成课程获得认证

开始学习
广告