Problem Solving/BOJ

[BOJ] #14891 _ 톱니바퀴

Grini 2019. 8. 28. 21:44

[톱니바퀴] https://www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴가 1번, 그 오른쪽은 2번, 그 오른쪽은 3번, 가장 오른쪽 톱니바퀴는 4번이다. 이때, 톱니바퀴를 총 K번 회전시키려고 한다. 톱니바퀴의 회전은 한 칸을 기준으로 한다. 회전은 시계 방향과 반시계 방향이 있고, 아래 그림과 같이 회전한다. 톱니바퀴를 회전시키려

www.acmicpc.net

톱니바퀴가 한 톱니바퀴의 회전에 따라 연쇄적으로 계속 도는 것이 아닌,

조건이 맞으면 딱 한 번씩만 회전하는 간단한 시뮬레이션 문제이다.

 

[ 소스 코드 ]

 

#include <cstdio>
#include <vector>
#include <cmath>
#include <cstring>
#include <algorithm>

using namespace std;

vector<vector<int> > wheel(4, vector<int>(8, 0));
int chk[4];

void turnWheel(int n, int d);
int solve();
int main() {
	int k, n, d;
	for (int i = 0; i < 4; i++) {
		for (int j = 0; j < 8; j++) scanf("%1d", &wheel[i][j]);
	}
	scanf("%d", &k);
	for (int i = 0; i < k; i++) {
		scanf("%d %d", &n, &d);
		turnWheel(n - 1, d);
		memset(chk, 0, sizeof(int) * 4);
	}

	printf("%d\n", solve());

	return 0;
}

void turnWheel(int n, int d) {
	int l = n - 1, r = n + 1, tmp;
	chk[n] = 1;

	if (r < 4) {
		if (chk[r] == 0) {
			if (wheel[n][2] != wheel[r][6]) turnWheel(r, d*(-1));
		}
	}
	if (l >= 0) {
		if (chk[l] == 0) {
			if (wheel[n][6] != wheel[l][2]) if (chk[l] == 0) turnWheel(l, d*(-1));
		}
	}

	if (d == 1) {
		tmp = wheel[n].back();
		wheel[n].pop_back();
		wheel[n].insert(wheel[n].begin(), tmp);
	}
	else {
		tmp = wheel[n].front();
		wheel[n].erase(wheel[n].begin());
		wheel[n].push_back(tmp);
	}
}

int solve() {
	int score = 0;

	for (int i = 0; i < 4; i++) {
		if (wheel[i][0]) score += pow(2, i);
	}

	return score;
}