반응형
https://www.acmicpc.net/problem/20061
20061번: 모노미노도미노 2
모노미노도미노는 아래와 같이 생긴 보드에서 진행되는 게임이다. 보드는 빨간색 보드, 파란색 보드, 초록색 보드가 그림과 같이 붙어있는 형태이다. 게임에서 사용하는 좌표 (x, y)에서 x는 행,
www.acmicpc.net
[ 문제풀이 ]
1. 블록을 놓았을 때 파란색 혹은 초록색 보드로 이동할 함수를 만듭니다.
2. 이동이 끝나고, 한 줄이 완성된다면 줄을 제거해주고 ans에 1을 더해줍니다.
3. 제거가 완료된 후 연한 부분에 블록이 남아있다면 한 줄을 또 제거해줍니다.
4. ans와 보드에 있는 블록의 개수를 출력해줍니다.
[ 소스코드 ]
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 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 | #include<iostream> using namespace std; int N; int arr[10][10]; int ans; void moveB(int num) //파란색 보드에서 열이 사라졌을 때 움직일 함수 { for (int i = num; i >= 4; i--) { for (int j = 0; j < 4; j++) { arr[j][i] = arr[j][i - 1]; } } } void moveG(int num) //초록색 보드에서 열이 사라졌을 때 움직일 함수 { for (int i = num; i >= 4; i--) { for (int j = 0; j < 4; j++) { arr[i][j] = arr[i-1][j]; } } } void remove() //연한 영역에 있거나, 한줄이 완성되면 없애는 함수 { for (int i = 9; i >= 6; i--) { bool flag = true; for (int j = 0; j < 4; j++) { if (arr[j][i] == 0) { flag = false; break; } } if (flag == true) { ans++; moveB(i); i++; } } for (int i = 9; i >= 6; i--) { bool flag = true; for (int j = 0; j < 4; j++) { if (arr[i][j] == 0) { flag = false; break; } } if (flag == true) { ans++; moveG(i); i++; } } bool flag = true; while (flag == true) { flag = false; for (int i = 0; i < 4; i++) { if (arr[i][5] == 1) { flag = true; break; } } if (flag == true) { moveB(9); } } flag = true; while (flag == true) { flag = false; for (int i = 0; i < 4; i++) { if (arr[5][i] == 1) { flag = true; break; } } if (flag == true) { moveG(9); } } } void move(int t, int x, int y) //처음 블록을 놓았을 때 블록을 움직이는 함수 { int idx = 10; if (t == 1) { for (int i = 0; i < 10; i++) { if (arr[i][y] == 1) { arr[i-1][y] = 1; break; } else if (i == 9) { arr[i][y] = 1; } } for (int i = 0; i < 10; i++) { if (arr[x][i] == 1) { arr[x][i-1] = 1; break; } else if (i == 9) { arr[x][i] = 1; } } } else if (t == 2) { for (int i = 4; i < 10; i++) { if (arr[i][y] == 1) { idx = min(idx, i); break; } } for (int i = 4; i < 10; i++) { if (arr[i][y+1] == 1) { idx = min(idx, i); break; } } arr[idx - 1][y] = 1; arr[idx - 1][y+1] = 1; for (int i = 4; i < 10; i++) { if (arr[x][i] == 1) { arr[x][i - 1] = 1; arr[x][i - 2] = 1; break; } else if (i == 9) { arr[x][i] = 1; arr[x][i - 1] = 1; } } } else { for (int i = 4; i < 10; i++) { if (arr[x][i] == 1) { idx = min(idx, i); break; } } for (int i = 4; i < 10; i++) { if (arr[x+1][i] == 1) { idx = min(idx, i); break; } } arr[x][idx - 1] = 1; arr[x + 1][idx - 1] = 1; for (int i = 4; i < 10; i++) { if (arr[i][y] == 1) { arr[i-1][y] = 1; arr[i - 2][y] = 1; break; } else if (i == 9) { arr[i][y] = 1; arr[i - 1][y] = 1; } } } remove(); } int main() { scanf("%d", &N); for (int i = 0; i < N; i++) { int t, x, y; scanf("%d %d %d", &t, &x, &y); move(t, x, y); int de = -1; } int cnt = 0; for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (arr[i][j] == 1) { cnt++; } } } printf("%d\n%d", ans, cnt); } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 19237번 - 어른 상어 (C++) (0) | 2022.09.30 |
---|---|
[ 백준 ] 19236번 - 청소년 상어 (C++) (0) | 2022.09.29 |
[ 백준 ] 17825번 - 주사위 윷놀이 (C++) (0) | 2022.09.27 |
[ 백준 ] 21611번 - 마법사 상어와 블리자드 (C++) (0) | 2022.09.26 |
[ 백준 ] 17822번 - 원판 돌리기 (C++) (0) | 2022.09.25 |