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]
广告