-
백준(BOJ) 15562 톱니바퀴(2)알고리즘 풀이/백준(Boj) 2019. 10. 10. 13:22
문제 : https://www.acmicpc.net/problem/15662
15662번: 톱니바퀴 (2)
총 8개의 톱니를 가지고 있는 톱니바퀴 T개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴가 1번, 그 오른쪽은 2번, ..., 가장 오른쪽 톱니바퀴는 T번이다. 아래 그림은 T가 4인 경우이다. 이때, 톱니바퀴를 총 K번 회전시키려고 한다. 톱니바퀴의 회전은 한 칸을 기준으로 한다. 회전은 시계 방향과 반시계 방향이 있고, 아래 그림과 같이 회전한다
www.acmicpc.net
풀이 :
한번 돌릴때의 일어나는 모든 상호작용은 큐로 처리한다. 즉 어떤 한 시계의 방향을 돌렸을때의 양옆의 톱니바퀴가 돌려질 수 있고 그로인해 또 양옆에 톱니바퀴가 돌려질 수 있기 때문이다.
처음 상태에 톱니들이 어떤 극으로 맞닿아 있는지 beforeRotate 에 넣어준다.
큐에 넣을 조건으로 그 톱니바퀴를 돌린 적이 없어야 하고 beforeRotate의 값이 달라야 넣을 수 있다.
코드 ( C++ )
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters#include <iostream> #include <string> #include <queue> #include <cstring> using namespace std; string t[1000]; int T; int visited[1000]; int beforeRotate[1000][2]; void Rotate(string& s) { int temp = s[7]; for (int i = 7; i > 0; --i) { s[i] = s[i - 1]; } s[0] = temp; } void reverseRotate(string& s) { int temp = s[0]; for (int i = 0; i < 7; ++i) { s[i] = s[i + 1]; } s[7] = temp; } int main() { cin >> T; for (int i = 0; i < T; ++i) { cin >> t[i]; } int k; cin >> k; queue<pair<int, int>> q; for (int i = 0; i < k; ++i) { int n1, n2; cin >> n1 >> n2; q.push({ n1-1,n2 }); memset(visited, 0, sizeof(visited)); //beforeRotate 정의 for (int i = 0; i < T; ++i) { //왼 beforeRotate[i][0] = t[i][6]; //오 beforeRotate[i][1] = t[i][2]; } while (!q.empty()) { int number = q.front().first; int dir = q.front().second; visited[number] = true; q.pop(); if (dir == -1) { //반시계회전 reverseRotate(t[number]); if (number - 1 >= 0 && beforeRotate[number - 1][1] != beforeRotate[number][0] && !visited[number - 1]) { q.push({ number - 1 , -dir }); } if (number + 1 < T && beforeRotate[number + 1][0] != beforeRotate[number][1] && !visited[number + 1]) { q.push({ number + 1 , -dir }); } } else if (dir == 1) { //시계회전 Rotate(t[number]); if (number - 1 >= 0 && beforeRotate[number - 1][1] != beforeRotate[number][0] && !visited[number - 1]) { q.push({ number - 1 , -dir }); } if (number + 1 < T && beforeRotate[number + 1][0] != beforeRotate[number][1] && !visited[number + 1]) { q.push({ number + 1 , -dir }); } } } } int cnt = 0; for (int i = 0; i < T; ++i) { if (t[i][0] == '1') cnt++; } cout << cnt << "\n"; return 0; } '알고리즘 풀이 > 백준(Boj)' 카테고리의 다른 글
백준(BOJ) 9944번 NxM 보드 완주하기 (0) 2019.10.13 백준(BOJ) 12996번 Acka (31) 2019.10.13 백준(BOJ) 2234번 성곽 (0) 2019.10.05 백준(BOJ) 1600번 말이 되고픈 원숭이 (63) 2019.10.03 백준(BOJ) 14442번 벽 부수고 이동하기 2 (31) 2019.10.01