遞迴與分治之棋盤覆蓋問題

2022-07-08 21:12:10 字數 2649 閱讀 8926

在乙個2^k * 2^k個方格組成的棋盤中,若有乙個方格與其他方格不同,則稱該方格為一特殊方格,且稱該棋盤為乙個特殊棋盤。

顯然特殊方格在棋盤上出現的位置有4^k種情形.因而對任何k≥0,有4^k種不同的特殊棋盤。

下圖所示的特殊棋盤為 k=2 時 16 個特殊棋盤中的乙個。

在棋盤覆蓋問題中,要用下圖中 4 中不同形態的 l 型骨牌覆蓋乙個給定的特殊棋牌上除特殊方格以外的所有方格,且任何 2 個 l 型骨牌不得重疊覆蓋。

易知,在任何乙個 2^k * 2^k 的棋盤中,用到的 l 型骨牌個數恰為 (4^k-1)/3 。

求解棋盤問題,可利用分治的策略。當 k>0 時,將 2^k * 2^k 棋盤分割為 4 個 2^(k-1) * 2^(k-1) 子棋盤,如下圖所示。

特殊方格必位於 4 個子棋盤之一,其餘 3 個子棋盤中無特殊方格。用乙個 l 型骨牌覆蓋這 3 個較小的棋盤的匯合處,如圖所示,將這 3 個無特殊方格的子棋盤轉化為特殊棋盤,從而將原問題化為 4 個較小規模的棋盤覆蓋問題。遞迴的使用 這種分割,直至棋盤簡化為 1x1 棋盤。

python實現**如下:

1

#coding =gbk23

4#tr左上角行號,tc左上角列號。dr特殊方格行號,dc特殊方格列號

5def

chessboard(board, size, tr, tc, dr, dc):

6if size <= 1:

7return

8global

tile

9 tile += 1

10 current_tile =tile

11 size //= 2

12if dr < tr + size and dc < tc +size:

13chessboard(board, size, tr, tc, dr, dc)

14else

:15 board[tr + size - 1][tc + size - 1] =current_tile

16 chessboard(board, size, tr, tc, tr + size - 1, tc + size - 1)

17if dr >= tr + size and dc < tc +size:

18 chessboard(board, size, tr +size, tc, dr, dc)

19else

:20 board[tr + size][tc + size - 1] =current_tile

21 chessboard(board, size, tr +size, tc,

22 tr + size, tc + size - 1)

23if dr < tr + size and dc >= tc +size:

24 chessboard(board, size, tr, tc +size, dr, dc)

25else

:26 board[tr + size - 1][tc + size] =current_tile

27 chessboard(board, size, tr, tc +size,

28 tr + size - 1, tc +size)

29if dr >= tr + size and dc >= tc +size:

30 chessboard(board, size, tr + size, tc +size, dr, dc)

31else

:32 board[tr + size][tc + size] =current_tile

33 chessboard(board, size, tr + size, tc +size,

34 tr + size, tc +size)

3536

37 tile =0

38 chessboard_size = 4

39 board = [[0 for x in range(chessboard_size)] for y in

range(chessboard_size)]

40 chessboard(board, chessboard_size, 0, 0, 1, 0)

4142 board = [[row[i] for row in board] for i in

range(len(board[0]))]

43for lst in

board:

44print(lst)

棋盤覆蓋問題(遞迴與分治)

棋盤覆蓋問題。有乙個2k 2k2k 2k的方格棋盤,恰有乙個方格是黑色的,其他為白色。你的任務是用包含3個方格的l型牌覆蓋所有白色方格。黑色方格不能被覆蓋,且任意乙個白色方格不能同時被兩個或更多牌覆蓋。如圖所示為l型牌的4種旋轉方式。當乙個黑塊位於某一角時,可以解決乙個邊長為2的正方形匹配。可是這樣...

分治與遞迴之棋盤覆蓋

棋盤覆蓋問題要求在2 k 2 k 個方格組成的棋盤中,給定任意乙個特殊點,實現對除該特殊點的棋盤實現全覆蓋。如圖所示 如下 include include using namespace std int title 1 設定l型骨牌編號 int board 2049 2049 void chessb...

棋盤覆蓋問題(分治,遞迴)

在乙個2 k 2 k個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。該棋盤為特殊棋盤,紅色的方格為特殊方格。棋盤覆蓋問題是指,要用圖2中的4種不同形態的l型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個l型骨牌不得重疊覆蓋。該問題就是在考察...