백준 - 6987번 월드컵

weenybeenymini·2021년 9월 10일
0

문제

각 나라들의 승, 무승부, 패의 수가 가능한 결과인지 판별!

생각

한 번씩, 각 국가별로 총 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;
}

0개의 댓글