所谓“夹吃棋”,即如果存在一个白子,它的两侧(横向或者纵向)相邻都是黑子,则这个棋子将被“夹吃”;对于黑棋亦然。
如果一个棋盘的局面没有一方被夹吃,或者黑白双方都被对面夹吃,则认为是平局。如果只有一方夹吃了另一方,则认为夹吃方赢,被夹吃方输。
第一行输入一个正整数,代表询问的次数。
接下来每组询问输入三行,每行是一个长度为3的字符串,字符串仅由'o'、'*'、'.'组成。其中'o'代表白棋,'*'代表黑棋,'.'代表未放置棋子。
对于每个棋局,输出一行字符串表示答案,小红获胜输出"kou",小紫获胜输出"yukari",平局输出"draw"。
3 ... o*o ... o** ooo ..* o*o *o* o*o
yukari kou draw
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let n,
lines = [];
let linecount = 0;
rl.on("line", function (line) {
if (!n) {
n = parseInt(line.trim());
} else {
lines.push(line.trim());
if (lines.length === 3 * n) {
rl.close();
for (let i = 0; i < 3 * n; i += 3) {
const arr = lines.slice(i, i + 3);
procressinput(arr);
}
}
}
});
const procressinput = (arr) => {
let b_count = 0;
let h_count = 0;
// 01
if (arr[0][1] === "*" && arr[0][0] === "o" && arr[0][2] === "o") {
b_count += 1;
} else if (arr[0][1] === "o" && arr[0][0] === "*" && arr[0][2] === "*") {
h_count += 1;
}
// 10
if (arr[1][0] === "*" && arr[0][0] === "o" && arr[2][0] === "o") {
b_count += 1;
} else if (arr[1][0] === "o" && arr[0][0] === "*" && arr[2][0] === "*") {
h_count += 1;
}
// 11
if (arr[1][1] === "*" && arr[1][0] === "o" && arr[1][2] === "o") {
b_count += 1;
} else if (arr[1][1] === "o" && arr[1][0] === "*" && arr[1][2] === "*") {
h_count += 1;
}
if (arr[1][1] === "*" && arr[0][1] === "o" && arr[2][1] === "o") {
b_count += 1;
} else if (arr[1][1] === "o" && arr[0][1] === "*" && arr[2][1] === "*") {
h_count += 1;
}
// 12
if (arr[1][2] === "*" && arr[0][2] === "o" && arr[2][2] === "o") {
b_count += 1;
} else if (arr[1][2] === "o" && arr[0][2] === "*" && arr[2][2] === "*") {
h_count += 1;
}
// 21
if (arr[2][1] === "*" && arr[2][0] === "o" && arr[2][2] === "o") {
b_count += 1;
} else if (arr[2][1] === "o" && arr[2][0] === "*" && arr[2][2] === "*") {
h_count += 1;
}
if (b_count > 0 && h_count > 0) {
console.log("draw");
} else if (b_count > 0 && h_count == 0) {
console.log("yukari");
} else if (h_count > 0 && b_count == 0) {
console.log("kou");
} else if (h_count == 0 && b_count == 0) {
console.log("draw");
}
}; def check_horizontal(grid, i, j, target):
# 检查水平方向是否满足获胜条件
# 若目标位置在最左或最右列,无法形成水平三连,直接返回False
if j == 0 or j == 2:
return False
# 获取目标位置左右两侧的棋子
left = grid[i][j-1]
right = grid[i][j+1]
# 若目标棋子为'o'(黑棋),检查左右是否均为'*'(白棋)
if target == 'o':
return left == '*' and right == '*'
# 若目标棋子为'*'(白棋),检查左右是否均为'o'(黑棋)
else:
return left == 'o' and right == 'o'
def check_vertical(grid, i, j, target):
# 检查垂直方向是否满足获胜条件
# 若目标位置在最上或最下行,无法形成垂直三连,直接返回False
if i == 0 or i == 2:
return False
# 获取目标位置上下两侧的棋子
up = grid[i-1][j]
down = grid[i+1][j]
# 若目标棋子为'o'(黑棋),检查上下是否均为'*'(白棋)
if target == 'o':
return up == '*' and down == '*'
# 若目标棋子为'*'(白棋),检查上下是否均为'o'(黑棋)
else:
return up == 'o' and down == 'o'
# 读取测试用例数量
t = int(input())
for _ in range(t):
# 读取3x3棋盘
grid = [input().strip() for _ in range(3)]
# 初始化黑棋和白棋的获胜次数
black_win = 0
white_win = 0
# 遍历棋盘每个位置
for i in range(3):
for j in range(3):
# 检查黑棋'o'的获胜条件
if grid[i][j] == 'o':
if check_horizontal(grid, i, j, 'o') or check_vertical(grid, i, j, 'o'):
black_win += 1
# 检查白棋'*'的获胜条件
elif grid[i][j] == '*':
if check_horizontal(grid, i, j, '*') or check_vertical(grid, i, j, '*'):
white_win += 1
# 根据获胜次数输出结果
if black_win > 0 and white_win == 0:
print("kou") # 黑棋获胜
elif white_win > 0 and black_win == 0:
print("yukari") # 白棋获胜
else:
print("draw") # 平局