围棋的气(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))