A25681. 五子棋编程实现一张棋盘由 n 条横线与 n 条竖线垂直交叉构成。当前棋盘上的交叉位置已有若干黑棋。现需在没有棋子的交叉位置落一颗黑棋,使得落子后,包含此棋子在内的横向或竖向或斜向能够形成连续五颗及以上的黑棋。请计算一共有多少个位置满足要求;如果没有位置满足要求,输出 0。以下图片是 4 种出现连续五颗黑棋的情况:例如:n = 8;棋盘由 8 条横线和 8 条竖线垂直交叉构成,棋盘已有黑棋如下图:…
填空题
中等
知识点
题目描述
五子棋
编程实现
一张棋盘由 n 条横线与 n 条竖线垂直交叉构成。当前棋盘上的交叉位置已有若干黑棋。
现需在没有棋子的交叉位置落一颗黑棋,使得落子后,包含此棋子在内的横向或竖向或斜向能够形成连续五颗及以上的黑棋。
请计算一共有多少个位置满足要求;如果没有位置满足要求,输出 0。
以下图片是 4 种出现连续五颗黑棋的情况:

例如:n = 8;棋盘由 8 条横线和 8 条竖线垂直交叉构成,棋盘已有黑棋如下图:

可以在以下位置放置黑棋(位置已使用红色框标注)来满足要求:

一共有 5 个位置可以满足要求。
输入描述
第一行输入一个整数 n(5≤n≤1000),表示棋盘的横线和竖线数量;
接下来输入 n 行,每行 n 个整数,整数只能为 0 或 1;0 表示该交叉位置没有黑棋,1 表示该交叉位置有黑棋,整数之间以一个空格隔开。
输出描述
输出一个整数,表示满足题目要求的位置数量;如果没有位置满足要求,输出 0。
样例输入
8
0 0 0 0 0 0 0 0
0 1 1 1 1 0 0 0
0 0 0 1 1 1 0 1
0 0 1 0 0 1 0 0
0 0 0 0 0 1 0 0
1 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0样例输出
5参考答案
n = int(input())
ls = []
for i in range(n):
r = list(map(int, input().split()))
ls.append(r)
fx = [
(0, 1), # 水平向右
(1, 0), # 垂直向下
(1, 1), # 右下对角线
(1, -1) # 左下对角线
]
count = 0
for i in range(n):
for j in range(n):
if ls[i][j] == 0:
for f in fx:
dx, dy = f
total = 1 # 包括当前要放置的棋子
# 向正方向延伸
x, y = i + dx, j + dy
while 0 <= x < n and 0 <= y < n and ls[x][y] == 1:
total += 1
x += dx
y += dy
# 向反方向延伸
x, y = i - dx, j - dy
while 0 <= x < n and 0 <= y < n and ls[x][y] == 1:
total += 1
x -= dx
y -= dy
if total >= 5:
count += 1
break # 只要有一个方向满足即可
print(count)
上一题
下一题