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]
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP