1. 한타임에 중복하여 돌리지 않도록 visited 배열을 이용해 체크한다.
2. 시계방향과 반시계방향으로 회전시키는 함수를 만든다.
3.
(1) 오른쪽 톱니를 돌릴 수 있으면 돌린다.
(2) 왼쪽 톱니를 돌릴 수 있으면 돌린다.
(3) 자기 자신을 돌린다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | #include <iostream> using namespace std; int t, k; int map[4][8]; bool visited[4]; void turn(int num, int wise) { //시계방향 if (wise == 1) { int n = map[num][7]; for (int i = 7; i > 0; i--) { map[num][i] = map[num][i - 1]; } map[num][0] = n; } //반시계방향 else { int n = map[num][0]; for (int i = 0; i < 7; i++) { map[num][i] = map[num][i + 1]; } map[num][7] = n; } } void solve(int num, int wise) { visited[num] = true; //오른쪽 if (num < 3 && map[num][2] != map[num + 1][6] && !visited[num + 1]) { solve(num + 1, -1 * wise); } //왼쪽 if (num > 0 && map[num][6] != map[num - 1][2] && !visited[num - 1]) { solve(num - 1, -1 * wise); } turn(num, wise); } void initVisited() { visited[0] = false; visited[1] = false; visited[2] = false; visited[3] = false; } int getResult() { int ans = 0; for (int i = 0; i < 4; i++) { if (map[i][0] == 1) ans += (1 << i); } return ans; } int main() { ios_base::sync_with_stdio(false); cin >> t; for (int tc = 1; tc <= t; tc++) { cin >> k; for (int i = 0; i < 4; i++) { for (int j = 0; j < 8; j++) { cin >> map[i][j]; } } int num, wise; while (k--) { cin >> num >> wise; solve(num - 1, wise); initVisited(); } cout << "#" << tc << " " << getResult() << "\n"; } return 0; } | cs |
'SWEA::문제풀이' 카테고리의 다른 글
3304 최장 공통 부분 수열 (0) | 2018.04.08 |
---|---|
2382 미생물 격리 (2) | 2018.03.29 |
4008 숫자 만들기 (0) | 2018.03.22 |
4012 요리사 (2) | 2018.03.17 |
1258 행렬찾기 (0) | 2018.02.25 |