Solution.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Solution {
static int [][] mag;
static int [] tmp;
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int T = Integer.parseInt(bf.readLine()); // test case
for(int tc=1;tc<=T;tc++) {
int K = Integer.parseInt(bf.readLine()); // 회전 시키려는 횟수
mag = new int[4][8]; // 자석 상태
for(int i=0;i<4;i++) { // 4개의 자석
st = new StringTokenizer(bf.readLine()," ");
for(int j=0;j<8;j++) { // 8 개의 날
mag[i][j] = Integer.parseInt(st.nextToken());
}
}
// 1 시계 방향 -1 반시계
for(int k=0;k<K;k++) {
st = new StringTokenizer(bf.readLine()," ");
tmp = new int[4]; // 자석 번호
int idx = Integer.parseInt(st.nextToken())-1; // 자석 번호 인덱스 맞춤
int dir = Integer.parseInt(st.nextToken()); // 회전 방향
rotate(idx, dir);
} // 입력 완료
int score = 0; //획득한 점수
if(mag[0][0]==1) score += 1; // 1번 점수
if(mag[1][0]==1) score += 2; // 2번 점수
if(mag[2][0]==1) score += 4; // 3번 점수
if(mag[3][0]==1) score += 8; // 4번 점수
System.out.println("#"+tc+" "+score);
} // test case end
} // main end
private static void rotate(int idx, int dir) {
tmp[idx] = dir; // 현재 자석의 어느 방향으로 회전해야하는 지
// 오른쪽
for(int i=idx+1;i<4;i++) {
if(mag[i][6]==mag[i-1][2]) break;
else tmp[i] -= tmp[i-1];
}
// 왼쪽
for(int i=idx-1;i>=0;i--) {
if(mag[i+1][6] == mag[i][2]) break;
else tmp[i] -= tmp[i+1];
}
// 회전
for(int i=0;i<4;i++) {
// 회전 방향 x
if(tmp[i]==0) continue;
// 시계 방향
else if(tmp[i]==1) {
int end = mag[i][7];
for(int j=7;j>0;j--) {
mag[i][j] = mag[i][j-1];
}
mag[i][0] = end;
}
// 반시계 방향
else if(tmp[i]==-1) {
int first = mag[i][0];
for(int j=0;j<7;j++) {
mag[i][j] = mag[i][j+1];
}
mag[i][7] = first;
}
}
} // rotate end
}