在乙個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型骨牌 覆蓋乙個帶有乙個特殊方格的棋盤,特殊方塊上不能覆蓋骨牌,其他方塊上...