#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <climits>
#define INF 37
using namespace std;
int dx[] = { -1, -1, 0, 1, 1, 1, 0, -1 };
int dy[] = { 0, 1, 1, 1, 0, -1, -1, -1 };
int countFlipPieces(const string& gameboard, int player_color, string grid, int direction) {
int count = 0;
int x = grid[0] - 'A', y = grid[1] - 'a';
int next_x = x + dx[direction], next_y = y + dy[direction];
char opponent_color = (player_color == 1) ? 'O' : 'X';
while (next_x >= 0 && next_x < 6 && next_y >= 0 && next_y < 6 && gameboard[next_x * 6 + next_y] == opponent_color) {
count++;
next_x += dx[direction];
next_y += dy[direction];
}
if (next_x >= 0 && next_x < 6 && next_y >= 0 && next_y < 6 && gameboard[next_x * 6 + next_y] == (player_color == 1 ? 'X' : 'O')) {
return count;
}
return 0;
}
int heuristicScore(const string& gameboard, int player_color) {
int player_pieces = 0, opponent_pieces = 0;
for (char c : gameboard) {
if (c == (player_color == 1 ? 'X' : 'O')) {
player_pieces++;
}
else if (c == (player_color == 1 ? 'O' : 'X')) {
opponent_pieces++;
}
}
return player_pieces - opponent_pieces;
}
string flipPieces(string boardState, int currentPlayer, string position) {
int row = position[0] - 'A', col = position[1] - 'a', piecesFlipped = 0;
int rowOffset[8] = { -1, -1, 0, 1, 1, 1, 0, -1 }, colOffset[8] = { 0, 1, 1, 1, 0, -1, -1, -1 };
char playerPiece = (currentPlayer == 1 ? 'X' : 'O');
for (int direction = 0; direction < 8; direction++) {
int originalRow = row, originalCol = col;
int piecesToFlip = countFlipPieces(boardState, currentPlayer, position, direction);
for (int i = 0; i < piecesToFlip; i++) {
piecesFlipped = 1;
row += rowOffset[direction], col += colOffset[direction];
boardState[6 * row + col] = playerPiece;
}
row = originalRow, col = originalCol;
}
if (piecesFlipped) boardState[6 * row + col] = playerPiece;
return boardState;
}
int minimaxSearch(string boardState, int currentPlayer, int maxDepth, int depth = 0, int noPlayCount = 0, int alpha = -INF, int beta = INF) {
string rows[6] = { "A", "B", "C", "D", "E", "F" }, cols[6] = { "a", "b", "c", "d", "e", "f" };
int maxScore = -INF, minScore = INF, bestMove = 0, moveMade = 0;
if (depth == maxDepth) {
return depth % 2 ? heuristicScore(boardState, ((currentPlayer - 1) ^ 1) + 1) : heuristicScore(boardState, currentPlayer);
}
for (int i = 0; i < 36; i++) {
if (boardState[i] != '+') continue;
if (alpha >= beta) {
return depth % 2 ? minScore : maxScore;
}
int row = i / 6, col = i % 6;
string newBoardState = flipPieces(boardState, currentPlayer, rows[row] + cols[col]);
if (newBoardState == boardState) continue;
moveMade = 1;
noPlayCount = 0;
if (depth % 2) {
int score = minimaxSearch(newBoardState, ((currentPlayer - 1) ^ 1) + 1, maxDepth, depth + 1, noPlayCount, alpha, beta);
if (minScore > score) {
beta = score;
bestMove = i;
minScore = score;
}
}
else {
int score = minimaxSearch(newBoardState, ((currentPlayer - 1) ^ 1) + 1, maxDepth, depth + 1, noPlayCount, alpha, beta);
if (maxScore < score) {
alpha = score;
bestMove = i;
maxScore = score;
}
}
}
if (!moveMade) {
if (noPlayCount == 1) {
return depth % 2 ? heuristicScore(boardState, ((currentPlayer - 1) ^ 1) + 1) : heuristicScore(boardState, currentPlayer);
}
noPlayCount++;
return minimaxSearch(boardState, ((currentPlayer - 1) ^ 1) + 1, maxDepth, depth + 1, noPlayCount, alpha, beta);
}
if (depth == 0) {
return bestMove;
}
return depth % 2 ? minScore : maxScore;
}
string numToLetter(int num) {
string letters = "ABCDEF";
string nums = "abcdef";
string letterCoords = "";
letterCoords += letters[num / 6];
letterCoords += nums[num % 6];
return letterCoords;
}
int main() {
int num, dep, no_play, alpha = -INF, beta = INF;
cin >> num;
while (num--) {
string state;
int player, depth;
cin >> state >> player >> depth;
int a = minimaxSearch(state, player, depth, dep, no_play, alpha, beta);
cout << numToLetter(a) << endl;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8Y2xpbWl0cz4KI2RlZmluZSBJTkYgMzcKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBkeFtdID0geyAtMSwgLTEsIDAsIDEsIDEsIDEsIDAsIC0xIH07CmludCBkeVtdID0geyAwLCAxLCAxLCAxLCAwLCAtMSwgLTEsIC0xIH07CgppbnQgY291bnRGbGlwUGllY2VzKGNvbnN0IHN0cmluZyYgZ2FtZWJvYXJkLCBpbnQgcGxheWVyX2NvbG9yLCBzdHJpbmcgZ3JpZCwgaW50IGRpcmVjdGlvbikgewoJaW50IGNvdW50ID0gMDsKCWludCB4ID0gZ3JpZFswXSAtICdBJywgeSA9IGdyaWRbMV0gLSAnYSc7CglpbnQgbmV4dF94ID0geCArIGR4W2RpcmVjdGlvbl0sIG5leHRfeSA9IHkgKyBkeVtkaXJlY3Rpb25dOwoJY2hhciBvcHBvbmVudF9jb2xvciA9IChwbGF5ZXJfY29sb3IgPT0gMSkgPyAnTycgOiAnWCc7CgoJd2hpbGUgKG5leHRfeCA+PSAwICYmIG5leHRfeCA8IDYgJiYgbmV4dF95ID49IDAgJiYgbmV4dF95IDwgNiAmJiBnYW1lYm9hcmRbbmV4dF94ICogNiArIG5leHRfeV0gPT0gb3Bwb25lbnRfY29sb3IpIHsKCQljb3VudCsrOwoJCW5leHRfeCArPSBkeFtkaXJlY3Rpb25dOwoJCW5leHRfeSArPSBkeVtkaXJlY3Rpb25dOwoJfQoKCWlmIChuZXh0X3ggPj0gMCAmJiBuZXh0X3ggPCA2ICYmIG5leHRfeSA+PSAwICYmIG5leHRfeSA8IDYgJiYgZ2FtZWJvYXJkW25leHRfeCAqIDYgKyBuZXh0X3ldID09IChwbGF5ZXJfY29sb3IgPT0gMSA/ICdYJyA6ICdPJykpIHsKCQlyZXR1cm4gY291bnQ7Cgl9CgoJcmV0dXJuIDA7Cn0KCmludCBoZXVyaXN0aWNTY29yZShjb25zdCBzdHJpbmcmIGdhbWVib2FyZCwgaW50IHBsYXllcl9jb2xvcikgewoJaW50IHBsYXllcl9waWVjZXMgPSAwLCBvcHBvbmVudF9waWVjZXMgPSAwOwoJZm9yIChjaGFyIGMgOiBnYW1lYm9hcmQpIHsKCQlpZiAoYyA9PSAocGxheWVyX2NvbG9yID09IDEgPyAnWCcgOiAnTycpKSB7CgkJCXBsYXllcl9waWVjZXMrKzsKCQl9CgkJZWxzZSBpZiAoYyA9PSAocGxheWVyX2NvbG9yID09IDEgPyAnTycgOiAnWCcpKSB7CgkJCW9wcG9uZW50X3BpZWNlcysrOwoJCX0KCX0KCXJldHVybiBwbGF5ZXJfcGllY2VzIC0gb3Bwb25lbnRfcGllY2VzOwp9CgpzdHJpbmcgZmxpcFBpZWNlcyhzdHJpbmcgYm9hcmRTdGF0ZSwgaW50IGN1cnJlbnRQbGF5ZXIsIHN0cmluZyBwb3NpdGlvbikgewoJaW50IHJvdyA9IHBvc2l0aW9uWzBdIC0gJ0EnLCBjb2wgPSBwb3NpdGlvblsxXSAtICdhJywgcGllY2VzRmxpcHBlZCA9IDA7CglpbnQgcm93T2Zmc2V0WzhdID0geyAtMSwgLTEsIDAsIDEsIDEsIDEsIDAsIC0xIH0sIGNvbE9mZnNldFs4XSA9IHsgMCwgMSwgMSwgMSwgMCwgLTEsIC0xLCAtMSB9OwoJY2hhciBwbGF5ZXJQaWVjZSA9IChjdXJyZW50UGxheWVyID09IDEgPyAnWCcgOiAnTycpOwoKCWZvciAoaW50IGRpcmVjdGlvbiA9IDA7IGRpcmVjdGlvbiA8IDg7IGRpcmVjdGlvbisrKSB7CgkJaW50IG9yaWdpbmFsUm93ID0gcm93LCBvcmlnaW5hbENvbCA9IGNvbDsKCQlpbnQgcGllY2VzVG9GbGlwID0gY291bnRGbGlwUGllY2VzKGJvYXJkU3RhdGUsIGN1cnJlbnRQbGF5ZXIsIHBvc2l0aW9uLCBkaXJlY3Rpb24pOwoKCQlmb3IgKGludCBpID0gMDsgaSA8IHBpZWNlc1RvRmxpcDsgaSsrKSB7CgkJCXBpZWNlc0ZsaXBwZWQgPSAxOwoJCQlyb3cgKz0gcm93T2Zmc2V0W2RpcmVjdGlvbl0sIGNvbCArPSBjb2xPZmZzZXRbZGlyZWN0aW9uXTsKCQkJYm9hcmRTdGF0ZVs2ICogcm93ICsgY29sXSA9IHBsYXllclBpZWNlOwoJCX0KCgkJcm93ID0gb3JpZ2luYWxSb3csIGNvbCA9IG9yaWdpbmFsQ29sOwoJfQoKCWlmIChwaWVjZXNGbGlwcGVkKSBib2FyZFN0YXRlWzYgKiByb3cgKyBjb2xdID0gcGxheWVyUGllY2U7CglyZXR1cm4gYm9hcmRTdGF0ZTsKfQoKaW50IG1pbmltYXhTZWFyY2goc3RyaW5nIGJvYXJkU3RhdGUsIGludCBjdXJyZW50UGxheWVyLCBpbnQgbWF4RGVwdGgsIGludCBkZXB0aCA9IDAsIGludCBub1BsYXlDb3VudCA9IDAsIGludCBhbHBoYSA9IC1JTkYsIGludCBiZXRhID0gSU5GKSB7CglzdHJpbmcgcm93c1s2XSA9IHsgIkEiLCAiQiIsICJDIiwgIkQiLCAiRSIsICJGIiB9LCBjb2xzWzZdID0geyAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiIH07CglpbnQgbWF4U2NvcmUgPSAtSU5GLCBtaW5TY29yZSA9IElORiwgYmVzdE1vdmUgPSAwLCBtb3ZlTWFkZSA9IDA7CgoJaWYgKGRlcHRoID09IG1heERlcHRoKSB7CgkJcmV0dXJuIGRlcHRoICUgMiA/IGhldXJpc3RpY1Njb3JlKGJvYXJkU3RhdGUsICgoY3VycmVudFBsYXllciAtIDEpIF4gMSkgKyAxKSA6IGhldXJpc3RpY1Njb3JlKGJvYXJkU3RhdGUsIGN1cnJlbnRQbGF5ZXIpOwoJfQoKCWZvciAoaW50IGkgPSAwOyBpIDwgMzY7IGkrKykgewoJCWlmIChib2FyZFN0YXRlW2ldICE9ICcrJykgY29udGludWU7CgkJaWYgKGFscGhhID49IGJldGEpIHsKCQkJcmV0dXJuIGRlcHRoICUgMiA/IG1pblNjb3JlIDogbWF4U2NvcmU7CgkJfQoKCQlpbnQgcm93ID0gaSAvIDYsIGNvbCA9IGkgJSA2OwoJCXN0cmluZyBuZXdCb2FyZFN0YXRlID0gZmxpcFBpZWNlcyhib2FyZFN0YXRlLCBjdXJyZW50UGxheWVyLCByb3dzW3Jvd10gKyBjb2xzW2NvbF0pOwoJCWlmIChuZXdCb2FyZFN0YXRlID09IGJvYXJkU3RhdGUpIGNvbnRpbnVlOwoJCW1vdmVNYWRlID0gMTsKCQlub1BsYXlDb3VudCA9IDA7CgoJCWlmIChkZXB0aCAlIDIpIHsKCQkJaW50IHNjb3JlID0gbWluaW1heFNlYXJjaChuZXdCb2FyZFN0YXRlLCAoKGN1cnJlbnRQbGF5ZXIgLSAxKSBeIDEpICsgMSwgbWF4RGVwdGgsIGRlcHRoICsgMSwgbm9QbGF5Q291bnQsIGFscGhhLCBiZXRhKTsKCQkJaWYgKG1pblNjb3JlID4gc2NvcmUpIHsKCQkJCWJldGEgPSBzY29yZTsKCQkJCWJlc3RNb3ZlID0gaTsKCQkJCW1pblNjb3JlID0gc2NvcmU7CgkJCX0KCQl9CgkJZWxzZSB7CgkJCWludCBzY29yZSA9IG1pbmltYXhTZWFyY2gobmV3Qm9hcmRTdGF0ZSwgKChjdXJyZW50UGxheWVyIC0gMSkgXiAxKSArIDEsIG1heERlcHRoLCBkZXB0aCArIDEsIG5vUGxheUNvdW50LCBhbHBoYSwgYmV0YSk7CgkJCWlmIChtYXhTY29yZSA8IHNjb3JlKSB7CgkJCQlhbHBoYSA9IHNjb3JlOwoJCQkJYmVzdE1vdmUgPSBpOwoJCQkJbWF4U2NvcmUgPSBzY29yZTsKCQkJfQoJCX0KCX0KCglpZiAoIW1vdmVNYWRlKSB7CgkJaWYgKG5vUGxheUNvdW50ID09IDEpIHsKCQkJcmV0dXJuIGRlcHRoICUgMiA/IGhldXJpc3RpY1Njb3JlKGJvYXJkU3RhdGUsICgoY3VycmVudFBsYXllciAtIDEpIF4gMSkgKyAxKSA6IGhldXJpc3RpY1Njb3JlKGJvYXJkU3RhdGUsIGN1cnJlbnRQbGF5ZXIpOwoJCX0KCQlub1BsYXlDb3VudCsrOwoJCXJldHVybiBtaW5pbWF4U2VhcmNoKGJvYXJkU3RhdGUsICgoY3VycmVudFBsYXllciAtIDEpIF4gMSkgKyAxLCBtYXhEZXB0aCwgZGVwdGggKyAxLCBub1BsYXlDb3VudCwgYWxwaGEsIGJldGEpOwoJfQoKCWlmIChkZXB0aCA9PSAwKSB7CgkJcmV0dXJuIGJlc3RNb3ZlOwoJfQoKCXJldHVybiBkZXB0aCAlIDIgPyBtaW5TY29yZSA6IG1heFNjb3JlOwp9CnN0cmluZyBudW1Ub0xldHRlcihpbnQgbnVtKSB7CglzdHJpbmcgbGV0dGVycyA9ICJBQkNERUYiOwoJc3RyaW5nIG51bXMgPSAiYWJjZGVmIjsKCXN0cmluZyBsZXR0ZXJDb29yZHMgPSAiIjsKCWxldHRlckNvb3JkcyArPSBsZXR0ZXJzW251bSAvIDZdOwoJbGV0dGVyQ29vcmRzICs9IG51bXNbbnVtICUgNl07CglyZXR1cm4gbGV0dGVyQ29vcmRzOwp9CgppbnQgbWFpbigpIHsKCWludCBudW0sIGRlcCwgbm9fcGxheSwgYWxwaGEgPSAtSU5GLCBiZXRhID0gSU5GOwoJY2luID4+IG51bTsKCXdoaWxlIChudW0tLSkgewoJCXN0cmluZyBzdGF0ZTsKCQlpbnQgcGxheWVyLCBkZXB0aDsKCQljaW4gPj4gc3RhdGUgPj4gcGxheWVyID4+IGRlcHRoOwoJCWludCBhID0gbWluaW1heFNlYXJjaChzdGF0ZSwgcGxheWVyLCBkZXB0aCwgZGVwLCBub19wbGF5LCBhbHBoYSwgYmV0YSk7CgkJY291dCA8PCBudW1Ub0xldHRlcihhKSA8PCBlbmRsOwoJfQp9