OD C卷 - 围棋的气

围棋的气(100)

  • 围棋棋盘由纵横19条线垂直相交组成,一共19x19=361个交点,黑白棋子只能置于交点上;
  • 某个棋子的“气”是指其上、下、左、右四个方向的交叉点上,有几个交叉点没有棋子;
    • 在棋盘边缘的棋子最多有3口气(如黑1),在棋盘角点的棋子最多有2口气(如黑2),其他情况最多有4口气(如白1);
    • 所有同色棋子的气之和叫做该色棋子的气,同色棋子重合的气只能计算一次
      在这里插入图片描述
  • 根据输入的黑棋、白棋的坐标,计算黑棋、白棋各自一共有多少气;

输入描述:
第一行 黑棋坐标,两个数表示一个坐标
第二行 白棋坐标,两个数表示一个坐标
输出描述:
两个整数,空格分割,第一个为黑棋气数,第二个为白棋气数

示例1
输入:
0 5 8 9 9 10
5 0 9 9 9 8
输出:
8 7

思路:

  • 分别遍历黑棋、白棋坐标,计算各自的气;
  • 同色棋子重复的气,注意防止重复计算;

black_str = input().strip().split() # ["0", "5", "8", "9", "9", "10"]
n_black = len(black_str)
white_str = input().strip().split()
n_white = len(white_str)


black_list = []
white_list = []
for i in range(0, n_black, 2):
    black_list.append([int(black_str[i]), int(black_str[i+1])])

for i in range(0, n_white, 2):
    white_list.append([int(white_str[i]), int(white_str[i+1])])

black_gas = 0
white_gas = 0
visited = [[0 for _ in range(19)] for _ in range(19)]
# 四个方向
directs = [0, 1, 0, -1, 0]

# 计算黑棋  每个方向必须位置有效、非黑棋、非白棋、非重复的气,则计算累加
for black in black_list:
    x, y = black
    # 计算每个黑棋的气
    for d in range(4):
        xx = x + directs[d]
        yy = y + directs[d + 1]

        # 判断
        if xx >= 0 and xx < 19 and yy >=0 and yy < 19 and visited[xx][yy] == 0 and [xx, yy] not in black_list \
            and [xx, yy] not in white_list:
            black_gas += 1
            visited[xx][yy] = 1

# 初始化visited
for i in range(19):
    for j in range(19):
        visited[i][j] = 0

# 计算白棋的气
for white in white_list:
    x, y = white
    for d in range(4):
        xx = x + directs[d]
        yy = y + directs[d + 1]

        # 判断
        if xx >= 0 and xx < 19 and yy >= 0 and yy < 19 and visited[xx][yy] == 0 and [xx, yy] not in black_list \
                and [xx, yy] not in white_list:
            white_gas += 1
            visited[xx][yy] = 1

print("%d %d" % (black_gas, white_gas))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

laufing

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

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

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

打赏作者

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

抵扣说明:

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

余额充值