Main(){
for(N번동안){
Turn(처음 주어진 톱니를, 처음 주어진 방향으로);
Checked변수 초기화;
}
점수를 확인합니다.
}
Turn(현재 톱니,방향){
Splash() //현재 톱니의 왼쪽 혹은 오른쪽이 연쇄적으로 돌게 된다면 이들도 재귀적으로 Turn을 실행합니다.
if(방향이 시계방향){
TurnClockWise();
}else{
TurnCounterClockWise();
}
}
TurnClockWise(톱니){
톱니의 맨 뒤에 값을 가장 앞으로 옮깁니다.
}
TurnCounterClockWise(톱니){
톱니의 가장 앞의 값을 맨 뒤로 옮깁니다.
}
Splash(현재톱니, 방향){
if(현재톱니의 왼쪽 톱니를 아직 확인하지 않았다면{
해당 톱니를 체크했다는 표시를 남깁니다.
if(맞닿은 방향이 달라 회전시킬 수 있다면){
Turn(); // 현재톱니와 반대방향으로 왼쪽 톱니를 회전시킵니다.
}
}
if(현재톱니의 오른쪽 톱니를 아직 확인하지 않았다면{
해당 톱니를 체크했다는 표시를 남깁니다.
if(맞닿은 방향이 달라 회전시킬 수 있다면){
Turn(); // 현재톱니와 반대방향으로 오른쪽 톱니를 회전시킵니다.
}
}
}
import java.util.*;
import java.io.*;
public class Main {
static List<Character>[] Gear; // index로 2번과 6번에 접근하기 위해 Deque가 아닌 lst를 썼습니다.
static boolean[] Checked = new boolean[4];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Gear = new LinkedList[4];
StringTokenizer st;
for (int i = 0; i < 4; i++) {
char[] chars = br.readLine().toCharArray();
Gear[i] = new LinkedList<Character>();
for (int j = 0; j < 8; j++) {
Gear[i].add(chars[j]);
}
}
int N = Integer.parseInt(br.readLine());
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
int StartGearNum = Integer.parseInt(st.nextToken());
boolean IsClockWise = (Integer.parseInt(st.nextToken()) == 1) ? true : false;
Turn(StartGearNum - 1, IsClockWise);
Arrays.fill(Checked, false);
}
System.out.println(Score());
}
public static void Turn(int index, boolean direction) {
Checked[index] = true;
Splash(index, direction); // 톱니를 돌리기 전에 맞닿은 톱니의 확인을 먼저 해줘야 합니다.
if (direction) {
TurnClockWise(Gear[index]);
} else {
TurnCounterClockWise(Gear[index]);
}
}
public static void TurnClockWise(List<Character> lst) {
char temp = lst.remove(lst.size() - 1); // pollLast
lst.add(0, temp); // addFirst
}
public static void TurnCounterClockWise(List<Character> lst) {
char temp = lst.remove(0); // pollFirst
lst.add(temp); // addLast
}
public static void Splash(int now, boolean direction) {
// 왼쪽
if (0 <= now - 1 && !Checked[now - 1]) {
Checked[now - 1] = true;
if (Gear[now - 1].get(2) != Gear[now].get(6)) {
Turn(now - 1, !direction);
}
}
// 오른쪽
if (now + 1 < 4 && !Checked[now + 1]) {
Checked[now + 1] = true;
if (Gear[now].get(2) != Gear[now + 1].get(6)) {
Turn(now + 1, !direction);
}
}
}
public static int Score() {
int score = 0;
for (int i = 0; i < Gear.length; i++) {
if (Gear[i].get(0) == '1')
score += Math.pow(2, i);
}
return score;
}
}