문제
14891: 기어
1열 기어1 상태, 2열 기어2 상태, 3열 기어3 상태, 4열 기어4 상태. 상태는 12시 방향에서 시작하는 8개의 정수로 구성됩니다.
www.acmicpc.net
설명
이 문제는 시뮬레이션 문제였습니다.
기어를 회전시키는 방법(어레이 좌우이동)과 기어를 회전시키면서 양쪽으로 기어를 회전시키는 방법
어떻게 대처해야 할지 고민해야 했다.
첫 번째 솔루션은 setWheel 함수의 회전을 구현했지만 “rotate”라는 유용한 함수가 있으므로 수정했습니다.
setWheel 함수는 회전 함수가 사용된 방향으로 이동하며 방향과 기어 수만 지정됩니다.
재귀 함수로 좌우 기어 응답을 구현했습니다. 오른쪽 및 왼쪽 기능은 이동하려는 기어를 기준으로 합니다.
별도로 구현되며, 1~4의 범위를 벗어나거나 전극이 같을 경우 아무런 변화 없이 기능이 종료되며, 조건이 만족되면 다음 기어에 setWheel 기능이 적용되며, 그런 다음 Die Function이 다시 호출되어 반복됩니다. 여기서 기어가 정상적으로 회전하려면 dir에 -1을 곱하여 반전시켜야 합니다.
회전 함수는 알고리즘 라이브러리에 저장된 함수입니다.
인수는 (시작 반복자, 시작 위치의 모든 반복자, 끝 반복자)로 구성되며 대표적인 예는 다음과 같습니다.
회전 (v.begin(), v.begin()+1, v.end()); // 시계 반대 방향
Rotate(v.begin(),v.begin() + v.size() – 1, v.end()) // 시계 방향
로 사용할 수 있습니다
소스 코드
#include <bits/stdc++.h>
using namespace std;
string wheel(5);
int K;
void setWheel(int n, int dir){
if(dir==1){
rotate(wheel(n).begin(), wheel(n).begin()+7, wheel(n).end());
}
else{
rotate(wheel(n).begin(), wheel(n).begin()+1, wheel(n).end());
}
}
void moveRight(int cur, int dir){
if(cur>=4) return;
if(wheel(cur)(2+dir)!=wheel(cur+1)(6)) {
setWheel(cur+1, -dir);
moveRight(cur+1, -dir);
}
}
void moveLeft(int cur, int dir){
if(cur<=1) return;
if(wheel(cur)(6+dir)!=wheel(cur-1)(2)) {
setWheel(cur-1, -dir);
moveLeft(cur-1, -dir);
}
}
int main(void){
ios::sync_with_stdio(0);
cin.tie(0);
for(int i=1;i<=4;i++){
cin >> wheel(i);
}
cin >> K;
while(K--){
int n, dir;
cin >> n >> dir;
setWheel(n,dir);
moveRight(n,dir);
moveLeft(n,dir);
}
int answer = 0;
for(int i=1;i<=4;i++){
if(wheel(i)(0)=='1'){
answer += (1<<(i-1));
}
}
cout << answer;
return 0;
}
/*
void setWheel(int n, int dir){
int temp;
int start = wheel(n)(0);
int end = wheel(n)(7);
if(dir==1){
temp = start;
for(int i=0;i<7;i++){
int t = wheel(n)(i+1);
wheel(n)(i+1) = temp;
temp = t;
}
wheel(n)(0) = temp;
}
else{
temp = end;
for(int i=7;i>0;i--){
int t = wheel(n)(i-1);
wheel(n)(i-1) = temp;
temp = t;
}
wheel(n)(7) = temp;
}
}
*/
검토
“rotate()”라는 새로운 함수에 대해 알아봤는데 단순히 반복적으로 회전하기 때문에 시간 복잡도가 중요한 문제라면
조심해야 할 것 같습니다. 최대한 깔끔하게 해결하려고 노력했지만 아직 해결하는 과정에 있습니다.
버그가 너무 많아서 시간이 좀 걸립니다.
감사해요