【问题描述】使用递归与分治策略解决棋盘覆盖问题
【输入形式】在屏幕上输入棋盘大小及特殊方格所在行号和列号。
【输出形式】输出使用L型骨牌进行棋盘覆盖结果。
【样例1输入】
2
1 2
【样例1输出】
2 -1 3 3
2 2 1 3
4 1 1 5
4 4 5 5
【样例说明】
输入:第一行输入整数k表示棋盘大小为2的k次幂,若k为2,则棋盘大小为4行4列;若k为3,则棋盘大小为8行8列。第二行输入特殊方格所在的行号和列号,以空格分隔,当前输入的:1 2,表示特殊方格在棋盘的第1行第2列。2<=k<=3。
输出:使用L型骨牌进行棋盘覆盖结果,由3个相同的数表示同一个L型骨牌,不同的骨牌用不同的数字表示。数字的大小表示棋盘覆盖的顺序。特殊方格在棋盘的第1行第2列,用-1表示。各整数间以空格分隔。
【Python代码】
#棋盘覆盖
def chessBoard(tr,tc,dr,dc,size):
if size == 1:
return
global tile
global board
tile += 1
t = tile
s = size//2
#覆盖左上角子棋盘
if dr<tr+s and dc<tc+s:
#特殊方格在此棋盘中
chessBoard(tr,tc,dr,dc,s)
else:
#此棋盘中无特殊方格
board[tr+s-1][tc+s-1] = t
#覆盖其余方格
chessBoard(tr,tc,tr+s-1,tc+s-1,s)
#覆盖右上角棋盘
if dr < tr + s and dc >= tc + s:
# 特殊方格在此棋盘中
chessBoard(tr, tc+s, dr, dc, s)
else:
# 此棋盘中无特殊方格
board[tr+s-1][tc+s] = t
# 覆盖其余方格
chessBoard(tr, tc+s, tr+s-1, tc+s, s)
#覆盖左下角棋盘
if dr >= tr + s and dc < tc + s:
# 特殊方格在此棋盘中
chessBoard(tr+s, tc, dr, dc, s)
else:
# 此棋盘中无特殊方格
board[tr + s][tc + s - 1] = t
# 覆盖其余方格
chessBoard(tr+s, tc, tr + s, tc + s - 1, s)
#覆盖右下角棋盘
if dr >= tr + s and dc >= tc + s:
# 特殊方格在此棋盘中
chessBoard(tr+s, tc+s, dr, dc, s)
else:
# 此棋盘中无特殊方格
board[tr + s][tc + s] = t
# 覆盖其余方格
chessBoard(tr+s, tc+s, tr+s, tc+s, s)
def show_chess(board):
n = len(board)
for i in range(n):
for j in range(n):
print(board[i][j], end=" ")
print('')
#数据接收
tile = 0 # 表示骨牌编号
size = int(input()) # 棋盘大小
n= pow(2,size)
dr,dc= map(int,input().split()) # 特殊方格所在行号 特殊方格所在列号
board=[[0 for x in range(n)]for y in range(n)]#-1代表特殊格子
board[dr-1][dc-1]=-1
chessBoard(0,0,dr-1,dc-1,n)
show_chess(board)