미네랄에서 고통받다 보니 이런류는 어느정도 익숙해졌다.
떨어질 때 빈공간을 무조건 메꾼다는 조건이 있으면 참 편하다. 반대로 형태를 유지해야 하면 좀 귀찮다.
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 | #include <stdio.h> char a[12][8]; int xq[100], yq[100], qi, c[12][6], ans, f = 1; int dx[] = { 0,0,1,-1 }, dy[] = { 1,-1,0,0 }; void dfs(int x, int y) { c[x][y] = ans; xq[qi] = x; yq[qi++] = y; for (int i = 0; i < 4; i++) { int nx = x + dx[i], ny = y + dy[i]; if (nx < 0 || ny < 0 || nx>12 || ny>5 || a[nx][ny] != a[x][y] || c[nx][ny] == ans) continue; dfs(nx, ny); } } void del() { f = 1; for (int i = 0; i < qi; i++) { a[xq[i]][yq[i]] = '.'; } } void search() { for (int i = 0; i < 12; i++) for (int j = 0; j < 6; j++) { if (a[i][j] != '.') { qi = 0; dfs(i, j); if (qi >= 4) del(); } } } void drop() { for (int i = 0; i < 6; i++) { int pad = a[11][i] == '.' ? 1 : 0; for (int j = 10; j >= 0; j--) { if (a[j][i] == '.') pad++; else { char temp = a[j][i]; a[j][i] = a[j + pad][i]; a[j + pad][i] = temp; } } } } int main() { for (int i = 0; i < 12; i++) scanf(" %s", &a[i]); while (f) { f = 0; ans++; search(); drop(); } printf("%d", ans - 1); return 0; } | cs |
'BOJ' 카테고리의 다른 글
5052 전화번호 목록 (0) | 2018.02.18 |
---|---|
1072 게임 (0) | 2018.02.18 |
4963 섬의 개수 (0) | 2018.02.18 |
11812 K진 트리 (0) | 2018.02.18 |
1761 정점들의 거리 (0) | 2018.02.17 |