这个问题就像是在玩一个寻找五子棋连线的小游戏。我们的目标是找出在棋盘上放一个棋子后,能够形成五个连续棋子的点。这里有几个步骤可以帮助我们找到这些点:
-
检查水平和垂直线:
- 首先,我们要检查棋盘上的每一行和每一列。对于每一行和每一列,我们都要看看有没有四个连续的棋子,如果有,那么在这四个棋子的两端再放一个棋子就能形成五子连线。
-
检查对角线:
- 除了水平和垂直线,我们还要检查棋盘上的两条主对角线(从左上到右下和从右上到左下)。方法和检查水平线和垂直线类似,只是方向不同。
-
寻找四个棋子的组合:
- 在每一行、每一列和对角线上,我们要找到所有四个连续棋子的组合。这些组合是形成五子连线的关键。
-
确定可以放棋子的位置:
- 对于每个四个棋子的组合,我们要检查在这两个棋子的两端是否可以放棋子形成五子连线。如果可以,就把这个位置记下来。
-
输出结果:
- 最后,我们将所有可以放棋子形成五子连线的位置整理成一个列表,这就是我们的答案。
举个例子,就像样例1中,我们可以看到棋盘中间有四个连续的棋子,如果我们在第一个和最后一个棋子的位置再放一个棋子,就能形成五子连线,所以输出是[[1, 1], [6, 6]]。
这个问题的难点在于要检查所有的行、列和对角线,而且要考虑到棋盘的大小是未知的,所以我们需要编写一个能够适应不同大小棋盘的算法。但是,通过上面这些步骤,我们可以系统地找到所有可能的位置,而不需要一个一个去试,这样就能提高效率。
def solution(n, array):
directions = [(0, 1), (1, 0), (1, 1), (1, -1)]
winning_moves = []
for i in range(n):
for j in range(n):
if array[i][j] == 0: # 如果当前点是空位
for dx, dy in directions:
count = 1 # 当前空位算作一个
# 正方向
x, y = i + dx, j + dy
while 0 <= x < n and 0 <= y < n and array[x][y] == 1:
count += 1
x += dx
y += dy
# 反方向
x, y = i - dx, j - dy
while 0 <= x < n and 0 <= y < n and array[x][y] == 1:
count += 1
x -= dx
y -= dy
# 如果形成了五子连线
if count >= 5:
winning_moves.append([i + 1, j + 1]) # 转为1-based索引
return winning_moves
if __name__ == "__main__":
# Add your test cases here
array = [
[0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0],
[0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 0],
]
print(solution(6, array) == [[1, 1], [6, 6]])