Programming/Algorithm
swe 4013 특이한 자석
OKOK
2018. 4. 14. 10:51
- 톱니바퀴 배열 - 회전 체크 함수 - 회전 시키는 함수 - 답 도출하기 - flag 초기화하기. |
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 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | /* 1025 특이한 자석 문제풀이 시작 1. 톱니바퀴 배열 2. 회전 체크 함수 3. 회전 시키기. 4. 답 도출하기 -flag 초기화 시키기. 체크하고 턴할때마다. */ #include <iostream> #include <algorithm> using namespace std; int map[5][8]; int flag[5]; int ans; int K; struct point{ int num, dir; }; point command[21]; void problemIn() { cin >> K; for (int i = 1; i < 5; i++) { for (int j = 0; j < 8; j++) { cin >> map[i][j]; } } for (int i = 0; i < K; i++) { cin >> command[i].num >> command[i].dir; } } void init() { ans = 0; } void turn_check(int num, int dir) { if (num == 1) { flag[1] = dir; if (map[1][2] != map[2][6]) { flag[2] = -dir; if (map[2][2] != map[3][6]) { flag[3] = dir; if (map[3][2] != map[4][6]) { flag[4] = -dir; } } } } else if (num == 2) { flag[2] = dir; if (map[2][6] != map[1][2]) { flag[1] = -dir; } if (map[2][2] != map[3][6]) { flag[3] = -dir; if (map[3][2] != map[4][6]) { flag[4] = dir; } } } else if (num == 3) { flag[3] = dir; if (map[3][2] != map[4][6]) { flag[4] = -dir; } if (map[3][6] != map[2][2]) { flag[2] = -dir; if (map[2][6] != map[1][2]) { flag[1] = dir; } } } else if (num == 4) { flag[4] = dir; if (map[4][6] != map[3][2]) { flag[3] = -dir; if (map[3][6] != map[2][2]) { flag[2] = dir; if (map[2][6] != map[1][2]) { flag[1] = -dir; } } } } } void turn_map() { // 맵 인덱스 1, 플래그 인덱스 1, 회전 인덱스 1개 for (int i = 1; i < 5; i++) { if (flag[i] == 1) { int tmp = map[i][7]; for (int k = 6; k >= 0; k--) { swap(map[i][k], map[i][k + 1]); } map[i][0] = tmp; } else if (flag[i] == -1) { int tmp = map[i][0]; for (int k = 1; k <= 7; k++) { swap(map[i][k], map[i][k - 1]); } map[i][7] = tmp; } } } void solve() { for (int i = 0; i < K; i++) { for (int j = 1; j < 5; j++) flag[j] = 0; turn_check(command[i].num, command[i].dir); turn_map(); } ans += (map[1][0] == 1) ? 1 : 0; ans += (map[2][0] == 1) ? 2 : 0; ans += (map[3][0] == 1) ? 4 : 0; ans += (map[4][0] == 1) ? 8 : 0; } int main() { int T; cin >> T; for (int tc = 1; tc <= T; tc++) { problemIn(); solve(); cout << "#" << tc << " " << ans << endl; init(); } return 0; } | cs |