首页 > 试题广场 >

小红的夹吃棋

[编程题]小红的夹吃棋
  • 热度指数:80 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
在一个3*3的棋盘上,小红和小紫正在玩“夹吃棋”。
所谓“夹吃棋”,即如果存在一个白子,它的两侧(横向或者纵向)相邻都是黑子,则这个棋子将被“夹吃”;对于黑棋亦然。
如果一个棋盘的局面没有一方被夹吃,或者黑白双方都被对面夹吃,则认为是平局。如果只有一方夹吃了另一方,则认为夹吃方赢,被夹吃方输。

小红执黑棋,小紫执白棋,现在给定一个局面,请你判断当前棋局是谁获胜。

输入描述:
第一行输入一个正整数t,代表询问的次数。
接下来每组询问输入三行,每行是一个长度为3的字符串,字符串仅由'o'、'*'、'.'组成。其中'o'代表白棋,'*'代表黑棋,'.'代表未放置棋子。


输出描述:
对于每个棋局,输出一行字符串表示答案,小红获胜输出"kou",小紫获胜输出"yukari",平局输出"draw"。
示例1

输入

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");
    }
};

发表于 2025-09-10 09:58:17 回复(0)
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")  # 平局
编辑于 2025-05-17 19:33:35 回复(0)