상세 컨텐츠

본문 제목

[정올 3195][C++] 팀 빙고게임

카테고리 없음

by 힐둔 2022. 9. 18. 16:14

본문

 

문제 : http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&code=3195&sca=be50 

출처 : USACO

 

USACO 제공 reference code ! http://usaco.org/current/data/sol_tttt_bronze_open18.html

경우의 수가 적다. 알파벳을 기준으로 이길 수 있는 가능성을 모두 조사해서  푼듯 하다 !! 간단한데 나는 이 방법이 왜 생각이 나지 않던가 ! 

#include <iostream>
#include <fstream>
using namespace std;

char B[3][3];

// Does 1 cow win?
int cow_wins(char ch)
{
    // Check diagonals
    if (B[0][0] == ch && B[1][1] == ch && B[2][2] == ch) return 1;
    if (B[0][2] == ch && B[1][1] == ch && B[2][0] == ch) return 1;

    // Check rows and columns
    for (int i = 0; i < 3; i++) {
        if (B[0][i] == ch && B[1][i] == ch && B[2][i] == ch) return 1;
        if (B[i][0] == ch && B[i][1] == ch && B[i][2] == ch) return 1;
    }

    return 0;
}

// Test if a team wins based on 3 characters in a row, column, or diagonal
bool check3(char ch1, char ch2, char a, char b, char c)
{
    // All 3 characters have to be either ch1 or ch2
    if (a != ch1 && a != ch2) return false;
    if (b != ch1 && b != ch2) return false;
    if (c != ch1 && c != ch2) return false;

    // ch1 and ch2 have to appear at least once each
    if (a != ch1 && b != ch1 && c != ch1) return false;
    if (a != ch2 && b != ch2 && c != ch2) return false;

    return true;
}

// Does a team win?
int team_wins(char ch1, char ch2)
{
    // Check diagonals
    if (check3(ch1, ch2, B[0][0], B[1][1], B[2][2])) return 1;
    if (check3(ch1, ch2, B[0][2], B[1][1], B[2][0])) return 1;

    // Check rows and columns
    for (int i = 0; i < 3; i++) {
        if (check3(ch1, ch2, B[0][i], B[1][i], B[2][i])) return 1;
        if (check3(ch1, ch2, B[i][0], B[i][1], B[i][2])) return 1;
    }

    return 0;
}

int main(void)
{
 //   ifstream fin("tttt.in");
//    ofstream fout("tttt.out");

    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            cin >> B[i][j];

    int answer1 = 0, answer2 = 0;
    for (char ch = 'A'; ch <= 'Z'; ch++)
        answer1 += cow_wins(ch);
    
    for (char ch1 = 'A'; ch1 <= 'Z'; ch1++)
        for (char ch2 = ch1 + 1; ch2 <= 'Z'; ch2++)
            answer2 += team_wins(ch1, ch2);

    cout << answer1 << "\n" << answer2 << "\n";
    return 0;
}

 

내 코드 # 

난 너무 어렵게 풀었나 보다.  세 개를 훑어서 각각 나오는 회수를 기록한다 (어떤 알파벳이 몇번 나왔는지가 체크 되어야 하고, 정렬을 이용하기로 했으므로 구조체로 선언했다.) 그리고 내림차순 정렬한다. 만약 가장 첫번째 항목이 세번 나왔으면 개인이 우승, 두번 나왔으면 팀이 우승한 케이스이다. 이렇게 풀었으나, 문제는 개인이나 팀이나 중복해서 이긴 경우가 체크가 되지 않았다. 그래서 중복 체크를 하기 위해서 우승 했던 개인이나 팀을 저장한 후 비교하는 방법을 택했다. 이렇게 풀지 말기를 바라며 코드는 공개 안하는 걸로......

 

 

댓글 영역