OneCompiler

Team Tic Tae Toe

42
#include <iostream>
using namespace std;

char B[3][3];

// Does one 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++) {
        // Column i
        if (B[0][i] == ch &&
            B[1][i] == ch &&
            B[2][i] == ch)
            return 1;

        // Row i
        if (B[i][0] == ch &&
            B[i][1] == ch &&
            B[i][2] == ch)
            return 1;
    }

    return 0;
}

// Checks whether a line contains exactly two different cows.
bool check3(char ch1, char ch2, char a, char b, char c)
{
    // Every character must 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 must appear at least once.
    if (a != ch1 && b != ch1 && c != ch1)
        return false;

    // ch2 must appear at least once.
    if (a != ch2 && b != ch2 && c != ch2)
        return false;

    return true;
}

// Does a team of two cows 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++) {
        // Column i
        if (check3(ch1, ch2, B[0][i], B[1][i], B[2][i]))
            return 1;

        // Row i
        if (check3(ch1, ch2, B[i][0], B[i][1], B[i][2]))
            return 1;
    }

    return 0;
}

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

    int answer1 = 0;
    int 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';
    cout << answer2 << '\n';

    return 0;
}