시나브로

14891. 톱니바퀴 본문

알고리즘/백준

14891. 톱니바퀴

혬혬 2020. 10. 14. 22:36
728x90
#include <iostream>
using namespace std;

int check[6] = { 0 }; //돌려야되는 것을 체크
int wheel[6][10] = { 0 };
void right(int i) { // 오른쪽에 돌려야 되는 것이 있는 지 확인한다.
	if (i ==5)
		return;
	if (wheel[i - 1][2] != wheel[i][6]) {
		if (check[i - 1] == -1)
			check[i] = 1;
		else
			check[i] = -1;
		right(i + 1);
	}
}
void left(int i) { // 왼쪽에 돌려야되는 것이 잇는 지 확인한다. 
	if (i == 0)
		return;
	if (wheel[i + 1][6] != wheel[i][2]) {
		if (check[i + 1] == -1)
			check[i] = 1;
		else
			check[i] = -1;
		left(i - 1);
	}

}
void rotation(int i, int r) {
	int temp = 0;
	if (r == 1) {
		temp = wheel[i][7];
		for (int k =7; k >0; k--) {
			wheel[i][k] = wheel[i][k-1];
		}
		wheel[i][0] = temp;
	}
	else {
		temp = wheel[i][0];
		for (int k = 0; k <8; k++) {
			wheel[i][k] = wheel[i][k + 1];
		}
		wheel[i][7] = temp;
	}
}

int main() {

	freopen("inp.inp", "r", stdin);
	freopen("out.out", "w", stdout);

	for (int i = 1; i <= 4; i++) {
		for (int j = 0; j < 8; j++) {
			char a;
			scanf("%c", &a);
			wheel[i][j] = a-'0';
		}
		char buf;
		scanf("%c", &buf);
	}
	int k = 0;
	cin >> k;
	for (int i = 0; i < k; i++) {
		int a, b;
		cin >> a >> b;
		check[a] = b;
		right(a + 1);
		left(a - 1);
		for (int i = 1; i < 5; i++) {
			if (check[i] != 0) {
				rotation(i, check[i]); //체크된 값에 따라 돌린다
				check[i] = 0;
			}
		}
	}
	int answer = 0;
	int score = 1;
	for (int i = 1; i <= 4; i++) {
		if (wheel[i][0] == 1)
			answer += score;
		score *= 2;
	}
	cout << answer;

	return 0;
}

 

 

 

 

 

www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터 �

www.acmicpc.net

 

 

 

728x90

'알고리즘 > 백준' 카테고리의 다른 글

14890. 경사로  (0) 2020.10.15
3190. 뱀  (0) 2020.10.14
14888. 연산자 끼워넣기  (0) 2020.08.27
2583. 영역 구하기  (0) 2020.08.07
2573. 빙산  (0) 2020.08.04
Comments