vector<deque< int>> 를 이용하여 gear입력을 받았다.
deque를 쓴 이유는 회전하는 각각의 톱니를 1차원 큐로 생각하여 회전시 각각의 앞과 뒤에 추가하거나 빼는과정을 하기위해서이다. 즉, 3시방향은 2번index 9시방향은 6번 index가 된다.
✌ 2가지 함수를 사용하였다.
1.dfs() 는 각 톱니가 움직일때 연쇄적으로 움직이는 좌우 톱니의 방향(ratate[]) 배열에 정보를 저장하는 역할
2.gear_turn() 은 dfs를 통해 얻어진 배열을 통해 4개의 톱니 정보에 맞게 회전시킨다.
처음에는 dfs()함수내에 gear_turn()을 넣어서 한번에 수행하려했는데 그렇게하면 이미 기어가 돌아간 상황이므로 연쇄적으로 좌,우 기어가 의도대로 돌아가지않는 예외가 생긴다.
#include<iostream>
#include<deque>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
vector<deque<int> > gear(5);
int k;
int rotate_gear[5];
bool check[5];
int total_score() {
int cnt = 0;
for (int i = 1; i < 5; i++) {
if (gear[i][0] == 1) {
if (i == 1) cnt++;
else if (i == 2) cnt += 2;
else if (i == 3) cnt += 4;
else cnt += 8;
}
}
return cnt;
}
void gear_turn() {
//기어 4개 회전
for (int i = 1; i <= 4; i++) {
if (rotate_gear[i] == 0) { //회전안함
continue;
}
else if (rotate_gear[i] == 1) { //시계방향
int temp = gear[i].back();
gear[i].pop_back();
gear[i].push_front(temp);
}
else { //반시계
int temp = gear[i].front();
gear[i].pop_front();
gear[i].push_back(temp);
}
}
}
void dfs(int num,int dir) { // 하나가 움직이면 양옆 연쇄적으로 돌아가야함-> dfs 활용
rotate_gear[num] = dir;//얻은 정보를 통해 rotate()진행할것
check[num] = true;
if (!check[num-1] && num - 1 >= 1) {
if (dir == 0) {
dfs(num - 1, 0);
}
if (gear[num][6] != gear[num - 1][2]) {
dfs(num - 1, -dir);
}
else if (gear[num][6] == gear[num - 1][2]) {
dfs(num - 1, 0);
}
}
if (!check[num + 1] && num < 4) {
if (dir == 0) {
dfs(num + 1, 0);
}
if (gear[num][2] != gear[num + 1][6]) {
dfs(num + 1, -dir);
}
else {
dfs(num + 1, 0);
}
}
}
int main() {
for (int j = 1; j < 5; j++) {
for (int i = 0; i < 8; i++) {
char a;
cin >> a;
gear[j].push_back(a - '0');
}
}
cin >> k;
for (int i = 0; i < k; i++) {
int num,dir;
cin >> num >> dir;
memset(check, false, sizeof(check));
dfs(num, dir); // rotate_gear에 각 기어 방향 정보저장
gear_turn();//회전
}
//점수계산
cout << total_score();
return 0;
}