首页 > 试题广场 >

小红的夹吃棋

[编程题]小红的夹吃棋
  • 热度指数:2075 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}在一个 3\times3 棋盘上,小红(执黑 ``\texttt{*}``)与小紫(执白 ``\texttt{o}``)进行“夹吃棋”。

\hspace{15pt}规则:若某棋子在横向或纵向上被对方两个棋子夹住(即三连中间为对方棋子),该中间棋子被“夹吃”。

\hspace{15pt}胜负判定:
\hspace{23pt}\bullet\, 若仅一方存在被夹吃的棋子,则对方获胜;
\hspace{23pt}\bullet\, 若双方均无被夹吃,或双方均被夹吃,则为平局。

\hspace{15pt}给定若干局面,判断结果。

输入描述:
\hspace{15pt}第一行输入整数 t(询问次数)。
\hspace{15pt}每组询问输入 3 行,每行长度为 3 的字符串,仅含 ``\texttt{o}``(白子)、``\texttt{'*'}``(黑子)、``\texttt{'.'}``(未落子),表示棋盘状态。


输出描述:
\hspace{15pt}对每局输出一行:
\hspace{23pt}\bullet\, 小红胜输出 ``\text{kou}``;
\hspace{23pt}\bullet\, 小紫胜输出 ``\text{yukari}``;
\hspace{23pt}\bullet\, 平局输出 ``\text{draw}``。
示例1

输入

3
...
o*o
...
o**
ooo
..*
o*o
*o*
o*o

输出

yukari
kou
draw
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int t = scanner.nextInt();
        scanner.nextLine(); // 消耗换行符

        for (int i = 0; i < t; i++) {
            // 读取3x3棋盘
            char[][] board = new char[3][3];
            for (int j = 0; j < 3; j++) {
                String line = scanner.nextLine();
                board[j] = line.toCharArray();
            }

            // 判断双方被夹吃的情况
            // 小红(黑棋)是否有被夹吃的棋子
            boolean redEaten = hasEaten(board, '*');
            // 小紫(白棋)是否有被夹吃的棋子
            boolean purpleEaten = hasEaten(board, 'o');

            // 根据规则判断结果
            if (redEaten && !purpleEaten) {
                System.out.println("yukari");  // 小紫胜
            } else if (!redEaten && purpleEaten) {
                System.out.println("kou");  // 小红胜
            } else {
                System.out.println("draw");  // 平局
            }
        }
        scanner.close();
    }

    /**
     * 检查指定棋子是否有被夹吃的情况
     * @param board 棋盘
     * @param piece 要检查的棋子('*'或'o')
     * @return 是否有被夹吃的棋子
     */
    private static boolean hasEaten(char[][] board, char piece) {
        char opponent = (piece == '*') ? 'o' : '*';

        // 检查横向被夹吃的情况
        for (int row = 0; row < 3; row++) {
            // 中间是当前棋子,两边是对方棋子
            if (board[row][1] == piece &&
                    board[row][0] == opponent &&
                    board[row][2] == opponent) {
                return true;
            }
        }

        // 检查纵向被夹吃的情况
        for (int col = 0; col < 3; col++) {
            // 中间是当前棋子,两边是对方棋子
            if (board[1][col] == piece &&
                    board[0][col] == opponent &&
                    board[2][col] == opponent) {
                return true;
            }
        }

        return false;
    }
}

发表于 2025-08-28 18:38:39 回复(0)