Py.CheckiO刷题—O‘REILLY岛:Xs and Os Referee

本文介绍了一种算法,用于判断TicTacToe游戏(即Xs和Os游戏)的结果,包括胜者和平局情况。通过分析3x3网格中的标记布局,该算法能准确识别X或O是否构成胜利条件,或者比赛是否以平局告终。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目背景:

Tic Tac Toe,有时也称为Xs和Os,是一款由两名玩家(X和O)轮流在3×3网格中标记空格的游戏。在水平、垂直或对角线行(NW-SE和NE-SW)中分别放置三个标记的玩家获胜。

但我们不会玩这个游戏。你将是这次比赛结果的裁判。你会得到一场比赛的结果,你必须决定比赛是以胜利还是平局结束,以及谁将是赢家。如果X玩家赢了,请确保返回“X”,如果O玩家赢了,请返回“O”。如果比赛是平局,则返回“D”。

Example:

checkio([
    "X.O",
    "XX.",
    "XOO"]) == "X"
checkio([
    "OO.",
    "XOX",
    "XOX"]) == "O"
checkio([
    "OOX",
    "XXO",
    "OXX"]) == "D"

代码实现: 

def checkio(game_result):
    els=[list(i) for i in game_result]
    for i in range(0,3):
        for j in range(0,3):
            if (i==0 and els[i][j]+els[i+1][j]+els[i+2][j]=='XXX') or (j==0 and els[i][j]+els[i][j+1]+els[i][j+2]=='XXX') or (els[0][0]+els[1][1]+els[2][2]=='XXX') or (els[2][0]+els[1][1]+els[0][2]=='XXX'): 
                return 'X'
            if (i==0 and els[i][j]+els[i+1][j]+els[i+2][j]=='OOO') or (j==0 and els[i][j]+els[i][j+1]+els[i][j+2]=='OOO') or (els[0][0]+els[1][1]+els[2][2]=='OOO') or (els[2][0]+els[1][1]+els[0][2]=='OOO'):
                return 'O'
    else:
        return 'D'

if __name__ == "__main__":
    print("Example:")
    print(checkio(["X.O", "XX.", "XOO"]))

    # These "asserts" using only for self-checking and not necessary for auto-testing
    assert checkio(["X.O", "XX.", "XOO"]) == "X", "X wins"
    assert checkio(["OO.", "XOX", "XOX"]) == "O", "O wins"
    assert checkio(["OOX", "XXO", "OXX"]) == "D", "Draw"
    assert checkio(["O.X", "XX.", "XOO"]) == "X", "X wins again"
    print("Coding complete? Click 'Check' to review your tests and earn cool rewards!")

思路分析:

本道题可以看成是二维数组问题,在python中一般用列表来表示数组,而二维数组就是列表里面嵌套列表。所给的函数参数是含字符串的列表,所以先要把参数列表给转化为二维的。该矩阵是3X3的矩阵,而游戏结果无非是X赢或者O赢或者平局,而赢棋就三行三列加两条对角线。用双循环遍历3X3矩阵,3行的情况就是判断j=0,在外循环的遍历下i=1,2,3时,j,j+1,j+2对应的元素是否成一行,同理3列的情况就是i=0,在内循环的遍历下,j=1,2,3时,i,i+1,i+2对应的元素是否成一列,外加两条已经确定好的对角线,即可得到答案。当然本题也有局限,属于3X3的枚举。

Best Code:

def checkio(result):
    rows = result
    cols = map(''.join, zip(*rows))
    diags = map(''.join, zip(*[(r[i], r[2 - i]) for i, r in enumerate(rows)]))
    lines = rows + list(cols) + list(diags)

    return 'X' if ('XXX' in lines) else 'O' if ('OOO' in lines) else 'D'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的思路很明确

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值