각 나라들의 승, 무승부, 패의 수가 가능한 결과인지 판별!
한 번씩, 각 국가별로 총 5번에 경기를 치른다를 못 보고,
그냥 승, 무, 패 횟수 저장해서 처리하는 식으로 짰는데 바로 틀렸습니다 인 것
그래서 생각해보다가
아 각각의 나라가 승 패 한게, 다른 나라에 영향주겠구나
이걸 만족하는 경우만 봐야겠다! 까지는 생각했지만 푸는 법은 감이 안 잡혔는데,
나라별 대결 정보를 저장해놓고
(0,1), (0,2), (0,3) ... (5,6)
각 대결 정보별로
승 패, 무 무, 패 승 경우를 재귀로 타고타고 들어가야한다!
(대결 정보를 저장해놓고 모든 정보를 돌면서 경우들을 만들어야겠다는 생각이 어려운 것 같다)
#include <iostream>
#include <string>
#include <math.h>
#include <vector>
#include <algorithm>
using namespace std;
//각 나라들이 다른 나라와 한 번씩 대결해야하니까
//그냥 단순히 수 세는걸론 안 되고
//dfs로 돌면서 가능한 조합을 만들자!
int result;
vector<pair<int, int>> team; //나라 별로 될 수 있는 조합 만들어 놓기 총 15개 조합이 있을 수 있대
int input[6][5]; //나라별로 입력된 승 무 패 횟수 적어놓기
int games[6][3]; //dfs돌면서 가능한 경우 만들어보자
void dfs(int count) {
if (count == 15) {
for (int j = 0; j < 6; j++) {
for (int k = 0; k < 3; k++) {
if (input[j][k] != games[j][k]) {
return;
}
}
}
result = 1;
return;
}
int t1 = team[count].first;
int t2 = team[count].second;
//t1가 승 t2가 패한 경우
games[t1][0]++;
games[t2][2]++;
dfs(count + 1);
games[t1][0]--;
games[t2][2]--;
//t1 t2가 비긴 경우
games[t1][1]++;
games[t2][1]++;
dfs(count + 1);
games[t1][1]--;
games[t2][1]--;
//t1가 패 t2가 패한 경우
games[t1][2]++;
games[t2][0]++;
dfs(count + 1);
games[t1][2]--;
games[t2][0]--;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
//나라별 대결 정보 저장
for (int i = 0; i < 6; i++) {
for (int j = i + 1; j < 6; j++) {
team.push_back({ i, j });
}
}
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 6; j++) {
for (int k = 0; k < 3; k++) {
//들어온 정보는 input 배열에 표기해놓고
cin >> input[j][k];
//4번 경우를 봐야하므로 games 배열은 0으로 만들어줘!
games[j][k] = 0;
}
}
dfs(0);
cout << result << " ";
result = 0;
}
return 0;
}