
* rotate에서는 x의 배수인 원판들을 시계/반시계 방향으로 k번 회전한다.
* deque를 사용해서 시계방향은 한 원판에서 가장 뒤에 있는 요소를 가장 앞에 삽입한다. (pop_back -> push_front)
반시계방향은 가장 앞에 있는 요소를 가장 뒤에 삽입한다. (pop_front->push_back)
* deque에 저장된 값들을 다시 map에 넣는다.
* removeNums()에서는 인접한 숫자들을 지운다. 만약, 전체 원판을 통틀어 지울 수가 없다면 평균값에 따라 원판의 값을 조절한다.
* 각 좌표에서 상 하 좌 우를 살펴봤을 때 같은 수가 있으면 큐에 넣어준다. 만약, 전체 원판을 봤을 때 큐에 아무런 값도 없다면 지울 값이 없다는 것이다.
* *평균값을 double로 구해줘야 한다. * *
* 지워진 숫자들은 -1로 표시해준다.
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 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 | #include <iostream> #include <vector> #include <deque> #include <cstring> #include <queue> using namespace std; int n, m, t; int map[51][51]; bool deleted[51][51]; bool flag[51]; int dx[4] = {0, 0, -1, 1}, dy[4] = {-1, 1, 0, 0}; typedef pair< int , int > pp; void print( int x) { for ( int j = 1; j <= m; j++) { if (map[x][j] == -1) cout << 'x' << ' ' ; else { cout << map[x][j] << ' ' ; } } } void removeNums() { //인접한 숫자들을 지운다. queue<pp> q; for ( int i = 1; i <= n; i++) { for ( int j = 1; j <= m; j++) { if (map[i][j] == -1) continue ; bool flag = false ; for ( int d = 0; d < 4; d++) { int nx = i + dx[d]; int ny = j + dy[d]; if (nx < 1 || nx > n || ny < 1 || ny > m) continue ; if (map[i][j] == map[nx][ny]) { flag = true ; q.push(pp(nx, ny)); } } if (j == 1 && map[i][1] == map[i][m]) { flag= true ; q.push(pp(i, m)); } if (flag) q.push(pp(i, j)); } } if (q.empty()) { int sum = 0, cnt = 0; for ( int i = 1; i <= n; i++) { for ( int j = 1; j <= m; j++) { if (map[i][j] == -1) continue ; sum += map[i][j]; cnt++; } } double avg = ( double )(( double )sum / ( double )cnt); for ( int i = 1; i <= n; i++) { for ( int j = 1; j <= m; j++) { if (map[i][j] == -1) continue ; if (map[i][j] < avg) map[i][j]++; else if (map[i][j] > avg) map[i][j]--; } } } else { while (!q.empty()) { int x = q.front().first; int y = q.front().second; q.pop(); map[x][y] = -1; } } } void rotate( int x, int d, int k) { deque< int > dq; for ( int i = x; i <= n; i++) { if (i % x == 0) { for ( int j = 1; j <= m; j++) dq.push_back(map[i][j]); //x의 배수인 원판 if (d == 0) { //시계방향 int cnt = k; while (cnt--) { dq.push_front(dq.back()); dq.pop_back(); } } else { int cnt = k; while (cnt--) { dq.push_back(dq.front()); dq.pop_front(); } } int idx = 1; while (!dq.empty()) { map[i][idx++] = dq.front(); dq.pop_front(); } } } removeNums(); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> m >> t; for ( int i = 1; i <= n; i++) { for ( int j = 1; j <= m; j++) { cin >> map[i][j]; } } while (t--) { int x, d, k; cin >> x >> d >> k; rotate(x, d, k); } int sum = 0; for ( int i = 1; i <= n; i++) { for ( int j = 1; j <= m; j++) { if (map[i][j] == -1) continue ; sum += map[i][j]; } } cout << sum << '\n' ; return 0; } |
'BOJ > C++' 카테고리의 다른 글
[BOJ] 16939. 2X2X2 큐브 (0) | 2020.04.20 |
---|---|
[BOJ] 16932. 모양 만들기 (0) | 2020.04.20 |
[BOJ] 16918. 봄버맨 (0) | 2020.04.17 |
[BOJ] 9328. 열쇠 (0) | 2020.04.16 |
[BOJ] 14391. 종이조각 (0) | 2020.04.16 |