/*         Xiaochi (Jerry) Wang

            Contest #4

            Wootton High School

            Intermediate 5 Division            */

 

#include <iostream>

#include <string>

 

using namespace std;

 

int CountTakenPieces(char board[8][8], int row, int column, int direction);

bool PieceToTake(char board[8][8], int row, int column, int direction);

bool Placeable(char board[8][8], int row, int column, int direction);

string NewPlacement(int row, int column, int direction, int length);

 

int main()

{

            string input;

            int x;

            int o;

            char board[8][8];

            int max = 0;

            string output;

 

            for (int i = 0; i < 8; i++)

                        for (int j = 0; j < 8; j++)

                                    board[i][j] = ' ';

 

            cout << "INPUT - commas and spaces: ";

            getline(cin, input);

 

            x = (int)input.at(0) - 48;

            o = (int)input.at(x * 4 + 3) - 48;

 

            for (int i = 0; i < x; i++)

                        board[56 - (int)input.at(i * 4 + 3)][(int)input.at(i * 4 + 4) - 65] = 'X';

            for (int i = 0; i < o; i++)

                        board[56 - (int)input.at(4 * i + 4 * x + 6)][(int)input.at(4 * i + 4 * x + 7) - 65] = 'O';

 

            for (int i = 0; i < 8; i++)

                        for (int j = 0; j < 8; j++)

                                    for (int k = 0; k < 8; k++)

                                                if (board[i][j] == 'X')

                                                            if (CountTakenPieces(board, i, j, k) == max && max > 0)

                                                            {

                                                                        output += NewPlacement(i, j, k, CountTakenPieces(board, i, j, k));

                                                                        output += ", ";

                                                            }

                                                            else if (CountTakenPieces(board, i, j, k) > max)

                                                            {

                                                                        max = CountTakenPieces(board, i, j, k);

                                                                        output = "";

                                                                        output += NewPlacement(i, j, k, CountTakenPieces(board, i, j, k));

                                                                        output += ", ";

                                                            }

 

            cout << "OUTPUT: ";

 

            if (output == "")

                        cout << "NONE\n";

            else

            {

                        output.resize(output.length() - 2);

                        cout << output << endl;

            }

 

            main();

 

            return (0);

}

 

int CountTakenPieces(char board[8][8], int row, int column, int direction)

{

            int piecesTaken = 0;

 

            while (PieceToTake(board, row, column, direction))

            {

                        piecesTaken++;

 

                        switch (direction)

                        {

                                    case 0:            row--;            column--;        break;

                                    case 1:            row--;                                      break;

                                    case 2:            row--;            column++;       break;

                                    case 3:            column++;                               break;

                                    case 4:            row++;            column++;       break;

                                    case 5:            row++;                                     break;

                                    case 6:            row++;            column--;        break;

                                    case 7:            column--;                                break;

                        }

            }

 

            if (!Placeable(board, row, column, direction))

                        piecesTaken = 0;

 

            return (piecesTaken);

}

 

bool PieceToTake(char board[8][8], int row, int column, int direction)

{

            switch (direction)

            {

                        case 0:            if (row - 1 >= 0 && column - 1 >= 0 && board[row - 1][column - 1] == 'O') return (true);   break;

                        case 1:            if (row - 1 >= 0 && board[row - 1][column] == 'O')                                                                              return (true);   break;

                        case 2:            if (row - 1 >= 0 && column + 1 <= 7 && board[row - 1][column + 1] == 'O') return (true);   break;

                        case 3:            if (column + 1 <= 7 && board[row][column + 1] == 'O')                                                                  return (true);   break;

                        case 4:            if (row + 1 <= 7 && column + 1 <= 7 && board[row + 1][column + 1] == 'O') return (true);   break;

                        case 5:            if (row + 1 <= 7 && board[row + 1][column] == 'O')                                                                              return (true);   break;

                        case 6:            if (row + 1 <= 7 && column - 1 >= 0 && board[row + 1][column - 1] == 'O') return (true);   break;

                        case 7:            if (column - 1 >= 0 && board[row][column - 1] == 'O'=

)                                                                       return (true);   break;

            }

 

            return (false);

}

 

bool Placeable(char board[8][8], int row, int column, int direction)

{

            switch (direction)

            {

                        case 0:            if (row - 1 < 0 || column - 1 < 0 || board[row - 1][column - 1] == 'X') return (false);  break;

                        case 1:            if (row - 1 < 0 || board[row - 1][column] == 'X')                                                                   return (false);  break;

                        case 2:            if (row - 1 < 0 || column + 1 > 7 || board[row - 1][column + 1] == 'X') return (false);  break;

                        case 3:            if (column + 1 > 7 || board[row][column + 1] == 'X')                                                       return (false);  break;

                        case 4:            if (row + 1 > 7 || column + 1 > 7 || board[row + 1][column + 1] == 'X') return (false);  break;

                        case 5:            if (row + 1 > 7 || board[row + 1][column] == 'X')                                                                   return (false);  break;

                        case 6:            if (row + 1 > 7 || column - 1 < 0 || board[row + 1][column - 1] == 'X') return (false);  break;

                        case 7:            if (column - 1 < 0 || board[row][column - 1] == 'X')                                                       return (false);  break;

            }

 

            return (true);

}

 

string NewPlacement(int row, int column, int direction, int length)

{

            string placement;

 

            switch (direction)

            {

                        case 0:            placement += (char)(56 - (row - length - 1));                   placement += (char)(65 + (column - length - 1));            break;

                        case 1:            placement += (char)(56 - (row - length - 1));                   placement += (char)(65 + column);                                                           break;

                        case 2:            placement += (char)(56 - (row - length - 1));                   placement += (char)(65 + (column + length + 1));            break;

                        case 3:            placement += (char)(56 - row);                                                                placement += (char)(65 + (column + length + 1));            break;

                        case 4:            placement += (char)(56 - (row + length + 1));                   placement += (char)(65 + (column + length + 1));            break;

                        case 5:            placement += (char)(56 - (row + length + 1));                   placement += (char)(65 + column);                                                           break;

                        case 6:            placement += (char)(56 - (row + length + 1));                   placement += (char)(65 + (column - length - 1));            break;

                        case 7:            placement += (char)(56 - row);                                                                placement += (char)(65 + (column - length - 1));            break;

            }

 

            return (placement);

}