-
[백준 15898] 피아의 아틀리에 ~신비한 대회의 연금술사~C 프로그래밍/BOJ 2022. 10. 30. 00:14728x90
https://www.acmicpc.net/problem/15898
#include <cstdio> #include <vector> #include <cstring> int N; int ingred[10 + 2][4][4]; char color[10 + 2][4][4]; int ans; int Gama[5][5]; char Gama_c[5][5]; int choice[10 + 2]; int Location[4][2] = { {0, 0}, {0, 1}, {1, 0}, {1, 1} }; void input() { scanf("%d", &N); for (int d = 0; d < N; d++) { for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { scanf("%d", &ingred[d][i][j]); } } for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { scanf(" %c", &color[d][i][j]); } } } // init Gama color for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { Gama_c[i][j] = 'W'; } } } void CW90(int idx, int curr[4][4], char curr_c[4][4]) { for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { curr[i][j] = ingred[idx][4 - j - 1][i]; curr_c[i][j] = color[idx][4 - j - 1][i]; } } } void CW180(int idx, int curr[4][4], char curr_c[4][4]) { for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { curr[i][j] = ingred[idx][4 - 1 - i][4 - 1 - j]; curr_c[i][j] = color[idx][4 - 1 - i][4 - 1 - j]; } } } void CW270(int idx, int curr[4][4], char curr_c[4][4]) { for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { curr[i][j] = ingred[idx][j][4 - i - 1]; curr_c[i][j] = color[idx][j][4 - i - 1]; } } } void put_ingred(int idx, int rotate, int loc) { int curr[4][4]; char curr_c[4][4]; // 재료 변형 if (rotate == 0) { memcpy(curr, ingred[idx], sizeof(curr)); memcpy(curr_c, color[idx], sizeof(curr_c)); } else if (rotate == 1) CW90(idx, curr, curr_c); else if (rotate == 2) CW180(idx, curr, curr_c); else if (rotate == 3) CW270(idx, curr, curr_c); // 가마에 넣기 int xx = Location[loc][0]; int yy = Location[loc][1]; for (int i = xx; i < (xx + 4); i++) { for (int j = yy; j < (yy + 4); j++) { Gama[i][j] += curr[i - xx][j - yy]; if (Gama[i][j] < 0) Gama[i][j] = 0; else if (Gama[i][j] > 9) Gama[i][j] = 9; if (curr_c[i - xx][j - yy] == 'W') continue; else Gama_c[i][j] = curr_c[i - xx][j - yy]; } } //debug(); } int get_q() { int red = 0; int blue = 0; int green = 0; int yellow = 0; for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { if (Gama_c[i][j] == 'R') red += Gama[i][j]; else if (Gama_c[i][j] == 'B') blue += Gama[i][j]; else if (Gama_c[i][j] == 'G') green += Gama[i][j]; else if (Gama_c[i][j] == 'Y') yellow += Gama[i][j]; } } return (7 * red) + (5 * blue) + (3 * green) + (2 * yellow); } void DFS(int cnt) { if (cnt == 3) { // 재료 효능 계산 int quality = get_q(); if (ans < quality) ans = quality; return; } int tmp[5][5]; char tmp_c[5][5]; memcpy(tmp, Gama, sizeof(Gama)); memcpy(tmp_c, Gama_c, sizeof(Gama_c)); for (int d = 0; d < N; d++) { // 몇 번째 재료 for (int r = 0; r < 4; r++) { // 몇 번 회전해서 for (int idx = 0; idx < 4; idx++) { // 어떤 위치에 넣을 것인지 if (choice[d]) continue; // 한번 선택한 재료는 다시 선택할 수 없다. !! choice[d] = 1; put_ingred(d, r, idx); DFS(cnt + 1); choice[d] = 0; memset(Gama, 0, sizeof(Gama)); memset(Gama_c, 'W', sizeof(Gama_c)); memcpy(Gama, tmp, sizeof(tmp)); memcpy(Gama_c, tmp_c, sizeof(tmp_c)); } } } } int main() { input(); DFS(0); // 재료 몇개 넣었는지 printf("%d\n", ans); return 0; }
아 나 이문제 코드 좀 잘짠듯 ㅋㅋ 찢었다 ㅋㅅㅋ
계속 예제 테케가 675가 나와서 뭐지뭐지 했는데 알고보니,,,, 쓴 재료는 다시 쓸 수 없다는 사실,,,
그걸 알고 choice 배열 하나 둬서 쓴 재료는 continue하게 조건을 달아주었다.
728x90'C 프로그래밍 > BOJ' 카테고리의 다른 글
[백준 15730] 수영장 사장님 (0) 2022.10.30 [백준 17135] 캐슬디펜스 (0) 2022.10.30 [백준 18809] Gaaaaaaaaaarden (0) 2022.10.28 [백준 2917] 늑대 사냥꾼 (0) 2022.10.28 [자료구조] Greedy (0) 2022.10.26