ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 15898] 피아의 아틀리에 ~신비한 대회의 연금술사~
    C 프로그래밍/BOJ 2022. 10. 30. 00:14
    728x90

    아 일트성공 할 수 있었는데... cstring 개자슥...

    https://www.acmicpc.net/problem/15898

     

    15898번: 피아의 아틀리에 ~신비한 대회의 연금술사~

    "피아의 아틀리에 ~신비한 대회의 연금술사~"는 가난한 연금술사 피아의 성장스토리를 담은 게임이다. 이 게임의 가장 중요한 부분은 "대회"인데, 연금술로 높은 품질의 물건을 만들어 상금을 타

    www.acmicpc.net

    #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

    댓글

Designed by Tistory.