BOJ/C++ [BOJ] 피아의 아틀리에 ~신비한 대회의 연금술사~ IamToday 2019. 10. 29. 15:24 #include #include using namespace std; int n, ans = 0; typedef struct Element { int num; char color; }Element; Element ind[11][4][4][4]; typedef vector> E; bool picked[11]; int calc(E gama) { int R = 0, B = 0, G = 0, Y = 0; for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { if (gama[i][j].color == 'R') R += gama[i][j].num; else if (gama[i][j].color == 'B') B += gama[i][j].num; else if (gama[i][j].color == 'G') G += gama[i][j].num; else if(gama[i][j].color == 'Y') Y += gama[i][j].num; } } int res = 7 * R + 5 * B + 3 * G + 2 * Y; return res; } E makeBomb(int type, int x, int y, int dir, E gama) { //폭탄 제조 for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { gama[x + i][y + j].num += ind[type][dir][i][j].num; if (gama[x + i][y + j].num < 0) gama[x + i][y + j].num = 0; else if (gama[x + i][y + j].num > 9) gama[x + i][y + j].num = 9; if (ind[type][dir][i][j].color == 'W') continue; else gama[x + i][y + j].color = ind[type][dir][i][j].color; } } return gama; } void dfs(int cnt, E gama) { //3개의 재료를 뽑느다. if (cnt == 3) { //계산 int res = calc(gama); ans = ans < res ? res : ans; return; } for (int i = 0; i < n; i++) { if (!picked[i]) { picked[i] = true; //뽑고 배치까지 여기서 실행 //배치한 결과를 같이 보낸다. for (int j = 0; j <= 5 - 4; j++) { for (int k = 0; k <= 5 - 4; k++) { //가마의 사이즈 - 재료의 사이즈 for (int z = 0; z < 4; z++) { E tmp = makeBomb(i, j, k, z, gama); dfs(cnt + 1, tmp); } } } picked[i] = false; } } } void rotate(int type, int dir) { //로테이트 된 결과를 미리 저장해놓는다. for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { ind[type][dir][i][j] = ind[type][dir - 1][j][4 - i - 1]; } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n; E gama; gama.resize(5, vector(5)); for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { gama[i][j].num = 0; gama[i][j].color = 'W'; } } for (int i = 0; i < n; i++) { for (int j = 0; j < 4; j++) { for (int k = 0; k < 4; k++) { cin >> ind[i][0][j][k].num; } } for (int j = 0; j < 4; j++) { for (int k = 0; k < 4; k++) { cin >> ind[i][0][j][k].color; } } //로테이트 된 결과를 미리 저장해놓는다. for (int k = 1; k < 4; k++) { rotate(i, k); } } //for (int i = 0; i < n; i++) { // for (int j = 0; j < 4; j++) { // for (int z = 0; z < 4; z++) { // for (int k = 0; k < 4; k++) { // cout << ind[i][j][z][k].num << " " << ind[i][j][z][k].color << ' '; // } // cout << '\n'; // } // cout << '\n'; // } // cout << '\n'; //} dfs(0,gama); cout << ans << '\n'; return 0; }