BC110 井字棋

描述

KiKi和BoBo玩 “井”字棋。也就是在九宫格中,只要任意行、列,或者任意对角线上面出现三个连续相同的棋子,就能获胜。请根据棋盘状态,判断当前输赢。

输入描述:

三行三列的字符元素,代表棋盘状态,字符元素用空格分开,代表当前棋盘,其中元素为K代表KiKi玩家的棋子,为O表示没有棋子,为B代表BoBo玩家的棋子。

输出描述:

如果KiKi获胜,输出“KiKi wins!”;

如果BoBo获胜,输出“BoBo wins!”;

如果没有获胜,输出“No winner!”。

示例1

输入:

K O BO K BB O K

输出:

KiKi wins!

解法一:

"""
n n n 0 1 2
m m m 0 1 2
j j j 0 1 2
"""
n = input().split()  # 列表n
m = input().split()  # 列表m
j = input().split()  # 列表j
if n[0] == m[1] == j[2] == 'K' or n[2] == m[1] == j[0] == 'K':  # 正对角线 和 反对角线
    print('KiKi wins!')
elif n[0] == m[1] == j[2] == 'B' or n[2] == m[1] == j[0] == 'B':  # 正对角线 和 反对角线
    print('BoBo wins!')
elif n[0] == n[1] == n[2] == 'K' or m[0] == m[1] == m[2] == 'K' or j[0] == j[1] == j[2] == 'K' or n[0] == m[0] == j[
    0] == 'K' or n[1] == m[1] == j[1] == 'K' or n[2] == m[2] == j[2] == 'K':  # 正三行 和 竖三列
    print('KiKi wins!')
elif n[0] == n[1] == n[2] == 'B' or m[0] == m[1] == m[2] == 'B' or j[0] == j[1] == j[2] == 'B' or n[0] == m[0] == j[
    0] == 'B' or n[1] == m[1] == j[1] == 'B' or n[2] == m[2] == j[2] == 'B':  # 正三行 和 竖三列
    print('BoBo wins!')
else:
    print('No winner!')

解法二:

"""
解题思路:
1.巧妙的运用了行列规则的列表中的下标
2.列表的切片技巧,切成每行是1个元素,每列是1个元素,切2对角线
3.运用-1作为结束的标志,平局
4.巧妙的利用字典的键作为谁赢的标志,然后输出键值。
5.总结:巧妙运用切片、字典键值。。。

K O B
O K B
B O K

B O B
O B B
B O K

"""

lines = []
for i in range(3):
    lines.extend(input().split())  # extend在已存在的列表末尾一次性添加新的列表内容
    # ['K', 'O', 'B', 'O', 'K', 'B', 'B', 'O', 'K']
    # lines.append(input().split()) #  append() 方法用于在列表末尾添加新的对象。
    # [['K', 'O', 'B'], ['O', 'K', 'B'], ['B', 'O', 'K']]
# print(lines)

lk = ["K", "K", "K"]
lb = ["B", "B", "B"]

dict_winner = {"K": "KiKi wins!", "B": "BoBo wins!"}
m = [lines[0:3], lines[3:6], lines[6:9], lines[0::3], lines[1::3], lines[2::3], lines[0::4], lines[2:8:2], -1]
"""
[['B', 'O', 'B'], ['O', 'B', 'B'], ['B', 'O', 'K'], ['B', 'O', 'B'], ['O', 'B', 'O'], ['B', 'B', 'K'], ['B', 'B', 'K'], ['B', 'B', 'B'], -1]
[0:3]  取1-2    第一行
[3:6]  取3-5    第二行
[6:9]  取6-8    第三行
[0::3] 从0开始  第一列
[1::3] 从1开始  第二列
[2::3] 从2开始 每隔3个切片取值  第三列
[0::4] 从0开始 每隔4个切片取值  正对角
[2:8:2] 从2-8 每隔2个切片取值   反对角
"""

for i in m:
    if i == lk or i == lb:
        print(dict_winner[i[0]])  # i[0]表示输出序列索引i对应的列表第1个值,当作键传给字典,获取字典值
        break
    elif i == -1:  # 遍历结束标志符,遇到-1 表示遍历结束,未找到
        print("No winner!")

解析:

略、参考代码注释

20211129

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值