-
5656. [모의 SW 역량테스트] 벽돌 깨기SWexpertAcademy 2019. 7. 27. 01:44
#include<cstdio> #include<iostream> #include<queue> #include<algorithm> using namespace std; int n,h, w; int map[15][12]; int mapc[15][12]; int tc; int result = 1000000; struct brick { int x; int y; int value; brick(int a, int b, int c) { x = a; y = b; value = c; } }; void sorting() { for (int i = 0; i < w; i++) { for (int j = h - 1; j >= 0; j--) { if (map[j][i] == 0) { for (int k = j - 1; k >= 0; k--) { if (map[k][i] != 0) { map[j][i] = map[k][i]; map[k][i] = 0; break; } } } } } } void crush(brick bric) { queue<brick> q; int xx = bric.x; int yy = bric.y; int v = bric.value; brick nextbrick(xx, yy, v); if (v == 1) { map[xx][yy] = 0; sorting(); return; } q.push(brick(xx, yy, v)); while (!q.empty()) { xx = q.front().x; yy = q.front().y; v = q.front().value; q.pop(); for (int i = xx; i < xx + v; i++) { if (i < h) { if (i != xx && map[i][yy] > 1) { q.push(brick(i, yy, map[i][yy])); } map[i][yy] = 0; } } for (int i = xx; i > xx - v; i--) { if (i >= 0) { if (i != xx && map[i][yy] > 1) { q.push(brick(i, yy, map[i][yy])); } map[i][yy] = 0; } } for (int i = yy; i < yy + v; i++) { if (i < w) { if (i != yy && map[xx][i] > 1) { q.push(brick(xx, i, map[xx][i])); } map[xx][i] = 0; } } for (int i = yy; i > yy - v; i--) { if (i >= 0) { if (i != yy && map[xx][i] > 1) { q.push(brick(xx, i, map[xx][i])); } map[xx][i] = 0; } } } sorting(); } void cop() { for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { map[i][j] = mapc[i][j]; } } } void checking() { int count = 0; for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { if (map[i][j] != 0) { count++; } } } result = result > count ? count : result; } brick find(int x) { for (int i = 0; i < h; i++) { if (map[i][x] != 0) { return brick(i, x, map[i][x]); } } return brick(0, 0, 1); } void run(int k) { if (k == n) { int cnt = 0; for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { if (map[i][j] != 0) cnt++; } } if (cnt < result) result = cnt; return; } int temp[15][12]; for (int i = 0; i < 15; i++) { for (int j = 0; j < 12; j++) { temp[i][j] = map[i][j]; } } for (int i = 0; i < w; i++) { int x = 0, y = i; crush(find(y)); run(k + 1); for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { map[i][j] = temp[i][j]; } } } } int main() { cin >> tc; for (int t = 1; t <= tc; t++) { cin >> n >> w >> h; result = 1000000; for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { cin >> map[i][j]; mapc[i][j] = map[i][j]; } } run(0); cout << '#' << t<<' '<<result<<endl; } return 0; }
상당히 개고생한문제, 처음에 벽돌을 조합으로 주려고했는데, 조합으로 주면 시간초과가 계속나서 그냥 포기했고
재귀로 찾아냈다.
'SWexpertAcademy' 카테고리의 다른 글
2105. [모의 SW 역량테스트] 디저트 카페 (0) 2019.08.05 2117. [모의 SW 역량테스트] 홈 방범 서비스 (0) 2019.07.28 5653. [모의 SW 역량테스트] 줄기세포배양 (0) 2019.07.26 5650. [모의 SW 역량테스트] 핀볼 게임 (0) 2019.07.25 5644. [모의 SW 역량테스트] 무선 충전 (0) 2019.07.24