슈뢰딩거의 고등어

[BOJ] 14891 톱니바퀴 (C++) 본문

알고리즘

[BOJ] 14891 톱니바퀴 (C++)

슈뢰딩거의 고등어 2022. 1. 3. 17:35

https://www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴

www.acmicpc.net

 

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

struct Tire {
	char mag[10];
	int dir;

};

Tire tire[4];
int k;

void initTire() {

	for(int i=0; i<4; i++) {
		tire[i].dir = 0;
	}
}

void turnTire(int no, int dir) {
	char copy_mag[8];

	for(int i=0; i<8; i++)
		copy_mag[i] = tire[no].mag[i];

	// clockwise
	if (dir == 1) {
		tire[no].mag[0] = copy_mag[7];
		for(int i=1; i<8; i++)
			tire[no].mag[i] = copy_mag[i-1];

	}
	else if(dir == -1){
		tire[no].mag[7] = copy_mag[0];
		for(int i=0; i<7; i++)
			tire[no].mag[i] = copy_mag[i+1];
	}

}

void solve(int tire_no, int dir) {

	tire[tire_no].dir = dir;

	// -> check
	for(int no = tire_no; no < 3; no++) {

		// do not turn
		if (tire[no].mag[2] == tire[no+1].mag[6]) {
			break;
		}
		else {
			tire[no+1].dir = tire[no].dir * -1;
		}
	}

	// <- check
	for(int no = tire_no; no >= 1; no--) {
		
		// do not turn
		if(tire[no].mag[6] == tire[no-1].mag[2]) {
			break;
		}
		else {
			tire[no-1].dir = tire[no].dir * -1;
		}
	}
	
	// change into new pos
	for(int i=0; i<4; i++) {
		if(tire[i].dir != 0)
			turnTire(i, tire[i].dir);
	}
	
}


int count() {
	int ret = 0;

	for(int i=0; i<4; i++)
		if(tire[i].mag[0] == '1')
			ret += pow(2, i);
	return ret;
	
}

int main() {

	for(int i=0; i<4; i++) {
		cin >> tire[i].mag;
	}

	scanf("%d", &k);

	while(k--) {

		int tire_no, dir;
		scanf("%d %d", &tire_no, &dir);
		tire_no--;

		solve(tire_no, dir);
		initTire();
	}

	int res = count();

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

	return 0;
}

 

Comments