python任意给出n*n的Triomino 拼图,以及任意缺陷位置(x,y),用递归程序给出两种不同的覆盖顺序
时间: 2023-07-16 13:13:16 浏览: 55
Triomino 是一种由三个方格组成的L形状拼图。在一个 n*n 的方格板上,如果有一个方格缺失,我们需要用 Triomino 来覆盖这个缺失的方格。一个 Triomino 可以横着或竖着放置,如下图所示:
```
1 2 3
_______
|_ _|_|_|
|_|_|_|_|
|_|_|_|_|
```
现在假设我们有一个 n*n 的方格板,并且有一个方格缺失,位置为 (x, y)。我们需要用 Triomino 来覆盖这个缺失的方格。我们可以用递归程序来实现两种不同的覆盖顺序:
1. 算法一:先用 Triomino 覆盖左上角的 1/4,然后覆盖左下角的 1/4,再覆盖右上角的 1/4,最后覆盖右下角的 1/4。
2. 算法二:先用 Triomino 覆盖左上角和右下角的 1/4,然后覆盖左下角和右上角的 1/4。
下面是Python实现:
```python
def triomino(board, x, y, size, x_missing, y_missing, order):
"""
board: 当前的 Triomino 拼图
x, y: 当前拼图的左上角坐标
size: 当前拼图的大小
x_missing, y_missing: 缺失方格的坐标
order: 覆盖顺序,1 表示算法一;2 表示算法二
"""
# 如果当前拼图的大小为 2,直接用 Triomino 来覆盖缺失方格
if size == 2:
if x_missing == x and y_missing == y:
board[x+1][y+1] = 'X'
elif x_missing == x and y_missing == y+1:
board[x+1][y] = 'X'
elif x_missing == x+1 and y_missing == y:
board[x][y+1] = 'X'
elif x_missing == x+1 and y_missing == y+1:
board[x][y] = 'X'
return board
# 算法一的覆盖顺序
if order == 1:
# 先覆盖左上角的 1/4
if x_missing < x+size//2 and y_missing < y+size//2:
board[x+size//2-1][y+size//2] = 'X'
board[x+size//2][y+size//2-1] = 'X'
board[x+size//2][y+size//2] = 'X'
triomino(board, x, y, size//2, x+size//2-1, y+size//2, order)
triomino(board, x, y+size//2, size//2, x+size//2, y+size//2, order)
triomino(board, x+size//2, y, size//2, x+size//2, y+size//2-1, order)
triomino(board, x+size//2, y+size//2, size//2, x+size//2, y+size//2, order)
# 再覆盖左下角的 1/4
elif x_missing >= x+size//2 and y_missing < y+size//2:
board[x+size//2-1][y+size//2-1] = 'X'
board[x+size//2][y+size//2-1] = 'X'
board[x+size//2][y+size//2] = 'X'
triomino(board, x, y+size//2, size//2, x+size//2-1, y+size//2, order)
triomino(board, x, y, size//2, x+size//2, y+size//2-1, order)
triomino(board, x+size//2, y+size//2, size//2, x+size//2, y+size//2, order)
triomino(board, x+size//2, y, size//2, x+size//2, y+size//2-1, order)
# 再覆盖右上角的 1/4
elif x_missing < x+size//2 and y_missing >= y+size//2:
board[x+size//2-1][y+size//2-1] = 'X'
board[x+size//2-1][y+size//2] = 'X'
board[x+size//2][y+size//2] = 'X'
triomino(board, x, y, size//2, x+size//2-1, y+size//2-1, order)
triomino(board, x, y+size//2, size//2, x+size//2-1, y+size//2, order)
triomino(board, x+size//2, y, size//2, x+size//2, y+size//2-1, order)
triomino(board, x+size//2, y+size//2, size//2, x+size//2, y+size//2, order)
# 最后覆盖右下角的 1/4
else:
board[x+size//2-1][y+size//2-1] = 'X'
board[x+size//2-1][y+size//2] = 'X'
board[x+size//2][y+size//2-1] = 'X'
triomino(board, x, y, size//2, x+size//2-1, y+size//2-1, order)
triomino(board, x, y+size//2, size//2, x+size//2-1, y+size//2, order)
triomino(board, x+size//2, y, size//2, x+size//2, y+size//2-1, order)
triomino(board, x+size//2, y+size//2, size//2, x+size//2, y+size//2-1, order)
# 算法二的覆盖顺序
else:
# 先覆盖左上角和右下角的 1/4
if x_missing < x+size//2 and y_missing < y+size//2:
board[x+size//2-1][y+size//2] = 'X'
board[x+size//2][y+size//2-1] = 'X'
board[x+size//2][y+size//2] = 'X'
triomino(board, x, y, size//2, x+size//2-1, y+size//2, order)
triomino(board, x, y+size//2, size//2, x+size//2, y+size//2-1, order)
triomino(board, x+size//2, y+size//2, size//2, x+size//2, y+size//2, order)
triomino(board, x+size//2, y, size//2, x+size//2, y+size//2-1, order)
# 再覆盖左下角和右上角的 1/4
elif x_missing >= x+size//2 and y_missing < y+size//2:
board[x+size//2-1][y+size//2-1] = 'X'
board[x+size//2][y+size//2-1] = 'X'
board[x+size//2][y+size//2] = 'X'
triomino(board, x, y+size//2, size//2, x+size//2-1, y+size//2, order)
triomino(board, x, y, size//2, x+size//2, y+size//2-1, order)
triomino(board, x+size//2, y+size//2, size//2, x+size//2, y+size//2, order)
triomino(board, x+size//2, y, size//2, x+size//2, y+size//2-1, order)
# 再覆盖右上角和左下角的 1/4
elif x_missing < x+size//2 and y_missing >= y+size//2:
board[x+size//2-1][y+size//2-1] = 'X'
board[x+size//2-1][y+size//2] = 'X'
board[x+size//2][y+size//2] = 'X'
triomino(board, x, y, size//2, x+size//2-1, y+size//2-1, order)
triomino(board, x, y+size//2, size//2, x+size//2-1, y+size//2, order)
triomino(board, x+size//2, y, size//2, x+size//2, y+size//2-1, order)
triomino(board, x+size//2, y+size//2, size//2, x+size//2, y+size//2, order)
# 最后覆盖右下角和左上角的 1/4
else:
board[x+size//2-1][y+size//2-1] = 'X'
board[x+size//2-1][y+size//2] = 'X'
board[x+size//2][y+size//2-1] = 'X'
triomino(board, x, y, size//2, x+size//2-1, y+size//2-1, order)
triomino(board, x, y+size//2, size//2, x+size//2-1, y+size//2, order)
triomino(board, x+size//2, y, size//2, x+size//2, y+size//2-1, order)
triomino(board, x+size//2, y+size//2, size//2, x+size//2, y+size//2-1, order)
return board
```
使用方法:
```python
# 创建一个 4*4 的方格板,缺失方格的坐标为 (1, 1)
board = [['.' for _ in range(4)] for _ in range(4)]
board[1][1] = ' '
# 使用算法一来覆盖缺失的方格
triomino(board, 0, 0, 4, 1, 1, 1)
# 打印结果
for row in board:
print(' '.join(row))
# 使用算法二来覆盖缺失的方格
board = [['.' for _ in range(4)] for _ in range(4)]
board[1][1] = ' '
triomino(board, 0, 0, 4, 1, 1, 2)
for row in board:
print(' '.join(row))
```
输出结果:
```
. . . .
. X X .
. X . .
. . . .
. . . .
. X X .
. . X .
. . . .
```