-
[백준 6987] 월드컵C 프로그래밍/BOJ 2022. 12. 1. 01:50728x90
https://www.acmicpc.net/problem/6987
6987번: 월드컵
월드컵 조별 최종 예선에서는 6개국으로 구성된 각 조별로 동일한 조에 소속된 국가들과 한 번씩, 각 국가별로 총 5번의 경기를 치른다. 조별리그가 끝난 후, 기자가 보내온 각 나라의 승, 무승부
www.acmicpc.net
#include <cstdio> #include <cstring> int in[4][6][3]; int ans[6][3]; bool Possible[4] = {false, }; int Teams[15][2] = { {0, 1}, {0, 2}, {0, 3}, {0, 4}, {0, 5}, {1, 2}, {1, 3}, {1, 4}, {1, 5}, {2, 3}, {2, 4}, {2, 5}, {3, 4}, {3, 5}, {4, 5} }; void input() { for (int t = 0; t < 4; t++) { for (int r = 0; r < 6; r++) { for (int c = 0; c < 3; c++) { scanf("%d", &in[t][r][c]); } } } //debug(); } void chk_is_possible() { int is_poss = true; for (int t = 0; t < 4; t++) { is_poss = true; for (int r = 0; r < 6; r++) { for (int c = 0; c < 3; c++) { if (ans[r][c] != in[t][r][c]) { is_poss = false; break; } } if (!is_poss) break; } if (is_poss) Possible[t] = true; } //debugg(); } void DFS(int n) { if (n == 15) { chk_is_possible(); return; } // backup int tmp[6][3] = { 0, }; memcpy(tmp, ans, sizeof(tmp)); int t1 = Teams[n][0]; int t2 = Teams[n][1]; // t1 > t2 ans[t1][0] += 1; ans[t2][2] += 1; DFS(n + 1); memcpy(ans, tmp, sizeof(ans)); // t1 == t2 ans[t1][1] += 1; ans[t2][1] += 1; DFS(n + 1); memcpy(ans, tmp, sizeof(ans)); // t1 < t2 ans[t1][2] += 1; ans[t2][0] += 1; DFS(n + 1); memcpy(ans, tmp, sizeof(ans)); } int main() { input(); DFS(0); // 몇번째 게임 진행하는지 for (int t = 0; t < 4; t++) { printf("%d ", Possible[t]); } }
가지치기 하나도 안함 주의...
6팀 중에서 2개 뽑아 게임 진행하는 경우는 총 15가지 이다.
각 게임에서 어떤 팀이랑 어떤 팀이랑 붙을지 룩업테이블 만들어주고,
각각 승 / 패 , 무 / 무, 패 / 승 하는 경우를 탐색해주었다.
만약 15번의 게임에 대한 승패결정이 완료되면 chk_is_possible 함수를 통해 입력받은 결과테이블 중 같은 것이 있는지 확인한다.
똑같은 것이 있으면 Possible 테이블의 플래그를 true로 바꿔주고 없으면 빠져나온다.
728x90'C 프로그래밍 > BOJ' 카테고리의 다른 글
[백준 1941] 소문난 칠공주 (0) 2022.12.06 [백준 25598] Alive or Dead? (0) 2022.12.05 [백준 3055] 탈출 (0) 2022.11.30 [백준 15683] 감시 (0) 2022.11.29 [백준 14500] 테트로미노 (0) 2022.11.28