【問題描述】
在乙個 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 。現給出棋盤的大小和特殊方格所在的位置,請找出這種棋盤。
初看時感覺這題目很難,我們可以利用分治的思想,像圖一一樣,將乙個大棋盤不斷分成四個部分,直至每個部分只包含乙個方格,那麼遞迴的邊界就出來了。然後對於每乙個部分,我們需要找到特殊方格,就需要檢視這個特殊方格是否在我們現在找的這個範圍,如果在,就繼續找,不在,就將其對稱的部分用l型牌覆蓋,然後找該編號的l型牌覆蓋的區域。詳見**。
1vartile,size,k,i,x,y,j:longint;
2 a:array[-1..100,-1..100] of
longint;
3procedure
try(tr,tc,dr,dc,size:longint);
4var
s,t:longint;
5begin
6if size=1
then
7exit;
8 t:=tile;//l型牌的編號
9inc(tile);
10 s:=size div2;
11if (drand(dcthen//查詢是否在左上角,在,繼續找
12try(tr,tc,dr,dc,s)
13else//不在,將右下角用l型牌覆蓋,找該l型牌
14begin
15 a[tr+s-1,tc+s-1]:=t;
16 try(tr,tc,tr+s-1,tc+s-1
,s);
17end;18
if (drand(dc>=tc+s) then//查詢是否在右上角
19 try(tr,tc+s,dr,dc,s)
20else//不在將左下角用l型牌覆蓋
21begin
22 a[tr+s-1,tc+s]:=t;
23 try(tr,tc+s,tr+s-1,tc+s,s);
24end;25
if (dr>=tr+s)and(dcthen//查詢是否在左下角
26 try(tr+s,tc,dr,dc,s)
27else//不在將右上角用l型牌覆蓋
28begin
29 a[tr+s,tc+s-1]:=t;
30 try(tr+s,tc,tr+s,tc+s-1
,s);
31end;32
if (dr>=tr+s)and(dc>=tc+s) then//查詢是否在右下角
33 try(tr+s,tc+s,dr,dc,s)
34else//不在將左上角用l型牌覆蓋
35begin
36 a[tr+s,tc+s]:=t;
37 try(tr+s,tc+s,tr+s,tc+s,s);
38end;39
end;
40begin
41readln(size);
42readln(x,y);
43 tile:=1
;44 try(0,0
,x,y,size);
45for i:=0
to size-1
do46
begin
47for j:=0
to size-1
do48 write(a[i,j]:3,'');
49writeln;
50end;51
end.
棋盤覆蓋問題題解
在乙個2k 2k個方格組成的棋盤中,若恰有乙個方格與其他方格不同,則稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。現用若干個l型骨牌覆蓋在乙個給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個l型骨牌不得重疊覆蓋 我們先來看乙個k 2時的棋盤覆蓋問題 那我們怎麼去解決這個問題呢?如果採用分治的思想...
棋盤覆蓋問題
source code include include include using namespace std const int n 1024 int board n n count void cover int sx,int sy,int cx,int cy,int size,int cx1,i...
棋盤覆蓋問題
問題 在乙個2k 2k k 0 個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為特殊方格。顯然,特殊方格在棋盤中可能出現的位置有4k種,因而有4k種不同的棋盤,圖4.10 a 所示是k 2時16種棋盤中的乙個。棋盤覆蓋問題 chess cover problem 要求用圖4.10 b 所示...