In this problem, we're given a tic-tac-toe grid filled with letters of the alphabet. We want to find, for each individual letter and each pair of letters, whether the letter or pair of letters has a three-in-a-row.
So let's loop over all individual letters, and all pairs of letters. Then we can loop over all rows, columns and diagonals, and check whether all letters in the row, column, or diagonal are equal to the fixed letter or one of the fixed pair of letters. When checking whether all letters in some row or column or diagonal are one of a fixed pair of letters, we also have to check that not all three letters are equal.
As there are only 26 letters and 8 rows, columns, and diagonals, this algorithm easily runs in time.
Below is Brian Dean's solution in C++.
#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++) fin >> 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); fout << answer1 << "\n" << answer2 << "\n"; return 0; }