[BOJ]6987号ワールドカップ(Java)
2608 ワード
に答える
win-loss個数と引き分け個数だけが必要だと思ったら失敗します.
1. すべての可能な組み合わせ: A - B,C,D,E,F/B-C,D,E,F/C-D,E,F/D-E,F/E-F
2.マーチを囲んで回る 勝-敗/無-無/敗-勝の状況を見る
3.帰郷15回(総試合回数):有効試合結果!
コード#コード#
import java.util.*;
import java.io.*;
public class Main {
static final int T = 4; // 테스트 케이스 수
static int[][] game;
static int[][] match = new int[15][2]; // A-BCDEF / B-CDEF ... 저장
static boolean isPossible;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int idx = 0;
for(int i = 0 ; i < 6 ; i++){
for(int j = i+1 ; j < 6 ; j ++){
match[idx][0] = i;
match[idx][1] = j;
idx++;
}
}
tc:for(int tc = 0 ; tc<T ; tc++){
StringTokenizer st = new StringTokenizer(br.readLine());
game = new int[6][3];
for(int i = 0 ; i < 6 ; i++){
int win = Integer.parseInt(st.nextToken());
int draw = Integer.parseInt(st.nextToken());
int lose = Integer.parseInt(st.nextToken());
if(win + draw + lose != 5){ // 한 팀당 경기수가 5가 넘을 경우
System.out.print("0 "); continue tc;
}
game[i][0] = win;
game[i][1] = draw;
game[i][2] = lose;
}
isPossible = false;
doGame(0);
System.out.print(isPossible?"1 ":"0 ");
}
}
/*
만약 유효하지 않은 경기 결과라면, round 15회를 돌지 못한 채 끝남
*/
private static void doGame(int round) {
if(round == 15){ // 유효한 경기 결과
isPossible = true;
return;
}
int t1 = match[round][0];
int t2 = match[round][1];
// 각 팀에 승/패/무 cnt가 남아있어야 함
if(game[t1][0] > 0 && game[t2][2] > 0){ // t1: 승 / t2: 패
game[t1][0] --; game[t2][2] --;
doGame(round+1);
game[t1][0] ++; game[t2][2] ++; // 다시 돌려놓고 다음 경우 실행
}
if(game[t1][1] > 0 && game[t2][1] > 0){ // t1: 무 / t2: 무
game[t1][1] --; game[t2][1] --;
doGame(round+1);
game[t1][1] ++; game[t2][1] ++;
}
if(game[t1][2] > 0 && game[t2][0] > 0){ // t1: 패 / t2: 승
game[t1][2] --; game[t2][0] --;
doGame(round+1);
game[t1][2] ++; game[t2][0] ++;
}
}
}
Reference
この問題について([BOJ]6987号ワールドカップ(Java)), 我々は、より多くの情報をここで見つけました https://velog.io/@dot2__/BOJ-6987번-월드컵Javaテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol