遞迴 PTA棋盤覆蓋

2021-10-10 16:21:13 字數 1848 閱讀 5245

在乙個2^k * 2k(k為正整數,k<=10,length=2k)個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格(其座標為aa,bb,分別代表行座標號和列座標號),以及有四種l型骨牌(如下圖)。求用若干塊這種l型骨牌實現除該特殊點棋盤的全覆蓋。(本題要求採用分治演算法做)

輸入格式:

輸入三個數,分別是aa,bb,length.

輸出格式:

輸出整個棋盤。其中特殊方格填為0,然後鋪棋盤的順序為:先鋪四個子棋盤交界的部分,然後遞迴的對每個子棋盤按照左上,右上,右下,左下的順時針順序鋪滿棋盤。每一塊骨牌中三個方格數字相同,按照順序標號,即第一塊骨牌全標為1,第二塊骨牌全標為2,…,以此類推。輸出的每個數占4個場寬,右對齊。

輸入樣例:

1 1 4

表示:特殊格仔為(1,1),棋盤有4行4列。

輸出樣例:

0 2 3 3

2 2 1 3

5 1 1 4

5 5 4 4

表示:先鋪三個1(一塊l型骨牌),再鋪三個2,…,最後鋪三個5.

#include

int tile =1;

//全域性變數 骨牌編號

int board[

1000][

1000];

//棋盤

void

chessboard

(int tr,

int tc,

int dr,

int dc,

int size)

;int

main()

}scanf

("%d %d %d"

,&aa,

&bb,

&length)

;chessboard(1

,1,aa,bb,length)

;for

(int i=

1; i<=length; i++

)printf

("\n");

}return0;

}/**

* tr : 棋盤左上角的行號,tc棋盤左上角的列號

* dr : 特殊方格左上角的行號,dc特殊方格左上角的列號

* size :size = 2^k 棋盤規格為2^k*2^k

*/void

chessboard

(int tr,

int tc,

int dr,

int dc,

int size)

int t = tile++

;//l型骨牌編號

int s = size/2;

//分割棋盤

//覆蓋左上角子棋盤

if(dr

//特殊方格在此棋盤中

else

//特殊方格不在此棋盤中

//覆蓋右上角子棋盤

if(dr

=tc+s)

//特殊方格在此棋盤中

else

//特殊方格不在此棋盤中

//覆蓋右下角子棋盤

if(dr>=tr+s && dc>=tc+s)

//特殊方格在此棋盤中

else

//特殊方格不在此棋盤中

//覆蓋左下角子棋盤

if(dr>=tr+s && dc

//特殊方格在此棋盤中

else

//特殊方格不在此棋盤中

}

遞迴 棋盤覆蓋

問題描述 在乙個2 k 2 k 的方格組成的棋盤中,有乙個方格與其他方格不同,稱為特殊方格。現在邀請4中不同的l型骨牌 覆蓋給定的棋盤除特殊方格外的所有方格。例如 這是乙個k 2時的棋盤,特殊點座標為 0,1 四中l型骨牌如圖 程式 include define key 8 棋盤的階數 int ar...

棋盤覆蓋(遞迴的應用)

當 k 0 時,將2k 2k棋盤分割為4個 2k 1 2 k 1子棋盤 a 所示。特殊方格必位於 4個較小子棋盤之一中,其餘 3個子棋盤中無特殊方格。為了將這 3個無特殊方格的子棋盤轉化為特殊棋盤,可以用乙個 l型骨牌覆蓋這 3個較小棋盤的會合處,如 b 所示,從而將原問題轉化為 4個較小規模的棋盤...

演算法 遞迴 棋盤覆蓋問題

1 最小情況 2 原問題與子問題同型 3 原問題的解可以用子問題的解來構造 在乙個2的k次方 x 2的k次方 此處數學公式的插入待修改 個方格的棋盤中,恰有乙個方格與其他方格不同,則稱該方格為特殊方格,在棋盤覆蓋問題中,要用l型骨牌 覆蓋乙個帶有乙個特殊方格的棋盤,特殊方塊上不能覆蓋骨牌,其他方塊上...