Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

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]. 그래서 이것은 다음 때문입니다. 7일 동안 -

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 지도를 만들고 방문이라는 집합을 하나 만듭니다.

  • N이 0이면 셀을 반환합니다.

  • 방문한 세트에 셀 삽입

  • 범위 1에서 14까지의 i에 대해

    • 크기가 8인 temp라는 배열을 만듭니다.

    • 범위 1에서 6까지의 j에 대해

      • cells[j – 1] XOR cells[j + 1] =0이면 temp[j] :=1

    • 세포 :=임시

    • m[i] :=온도

    • 방문에 임시 삽입

  • 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]