首页 > 试题广场 >

小红的夹吃棋

[编程题]小红的夹吃棋
  • 热度指数: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)
t = int(input())
for i in range(t):
    matrix = []
    matrix.append(input())
    matrix.append(input())
    matrix.append(input())
    flag_hong = False
    flag_zi = False
    for j in range(3):
        if matrix[j]=='*o*' or (matrix[0][j]+matrix[1][j]+matrix[2][j])=='*o*':
            flag_hong = True
        elif matrix[j]=='o*o' or (matrix[0][j]+matrix[1][j]+matrix[2][j])=='o*o':
            flag_zi = True
    if flag_hong and not flag_zi:
        print('kou')
    elif not flag_hong and flag_zi:
        print('yukari')
    else:
        print('draw')
发表于 2025-08-24 22:40:32 回复(0)
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int T;
    cin >> T;
    while (T--) {
        vector<vector<char>> ary(5, vector<char>(5, '.'));
        char n;
        for (int x = 1; x <= 3; x++) {
            for (int y = 1; y <= 3; y++) {
                cin >> n;
                ary[x][y] = n;
            }
            cin.ignore();
        }
        int flag_zi = 0;
        int flag_hong = 0;
        for (int x = 1; x <= 3; x++) {
            for (int y = 1; y <= 3; y++) {
                if ((ary[x][y] == '*' && ary[x - 1][y] == 'o' && ary[x + 1][y] == 'o') ||
                        (ary[x][y] == '*' && ary[x][y - 1] == 'o' && ary[x][y + 1] == 'o')) {
                    flag_zi = 1;

                }
                if ((ary[x][y] == 'o' && ary[x - 1][y] == '*' && ary[x + 1][y] == '*') ||
                        (ary[x][y] == 'o' && ary[x][y - 1] == '*' && ary[x][y + 1] == '*')) {
                    flag_hong = 1;

                }
            }
        }

        if ((flag_zi == 0 && flag_hong == 0) || (flag_zi == 1 && flag_hong == 1)) {
            cout << "draw" << endl;
        } else if (flag_zi == 1 && flag_hong == 0) {
            cout << "yukari" << endl;
        } else if (flag_zi == 0 && flag_hong == 1) {
            cout << "kou" << endl;
        }
    }

}
发表于 2025-08-08 17:42:18 回复(0)
#include <iostream>
#include <vector>
using namespace std;


int is_win(char mp[3][3]) {
    int h = 0, z = 0;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            if (mp[i][j] == 'o') {
                if (j + 2 < 3 && mp[i][j + 2] == 'o' && mp[i][j + 1] == '*') {
                    h = 1;
                    continue;
                }
                if (j - 2 > 0 && mp[i][j - 2] == 'o' && mp[i][j - 1] == '*') {
                    h = 1;
                    continue;
                }
                if (i - 2 > 0 && mp[i - 2][j] == 'o' && mp[i - 1][j] == '*') {
                    h = 1;
                    continue;
                }
                if (i + 2 < 3 && mp[i + 2][j] == 'o' && mp[i + 1][j] == '*') {
                    h = 1;
                    continue;
                }

            }
            if (mp[i][j] == '*') {
                if (j + 2 < 3 && mp[i][j + 2] == '*' && mp[i][j + 1] == 'o') {
                    z = 1;
                    continue;
                }
                if (j - 2 > 0 && mp[i][j - 2] == '*' && mp[i][j - 1] == 'o') {
                    z = 1;
                    continue;
                }
                if (i - 2 > 0 && mp[i - 2][j] == '*' && mp[i - 1][j] == 'o') {
                    z = 1;
                    continue;
                }
                if (i + 2 < 3 && mp[i + 2][j] == '*' && mp[i + 1][j] == 'o') {
                    z = 1;
                    continue;
                }
            }

        }
    }

    if (h == 0 && z == 0) return 0;
    if (h == 1 && z == 0) return 2;
    if (h == 0 && z == 1) return 1;

    return 0;
}


int main() {
    int n, i = 0;
    char mp[3][3];
    cin >> n;
    int c = n * 3;
    while (c--) {
        string s;
        cin >> s;
        for (int j = 0; j < 3; j++) {
            mp[i][j] = s[j];
        }
        i++;
        if (i == 3) {
            i = 0;
            int r = is_win(mp);
            if (r == 1) {
                cout << "kou" << endl;
            } else if (r == 2) {
                cout << "yukari" << endl;
            } else {
                cout << "draw" << endl;
            }
        }
    }



}
发表于 2025-08-04 22:38:37 回复(0)