棋盤覆蓋問題 分治演算法

2022-09-08 21:00:19 字數 2046 閱讀 2117

演算法日誌記錄pta

在乙個2^k * 2^k (k為正整數,k<=10,length=2^k)個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格(其座標為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.

**c++:

#include

#include

#include

#include

using namespace std;

int dp[

2026][

2026];

///棋盤最大2^k*2^k ,k=10

int v[4]

[2]=

;///四個格仔基於原點的座標

//深搜遞迴分治

/***parm

*x,y棋盤左上角座標

*aa,ay 特殊點座標

*k 棋盤規模 2^k*2^k

*/int step=1;

void

dfs(

int x,

int y,

int ax,

int ay,

int k)

step++

;return;}

int flag =0;

//特殊點所在的棋盤

if(ax<=mx&&ay<=my)flag=0;

//特殊點在左上棋盤

if(ax>=

(mx+1)

&&ay<=my)flag=1;

//特殊點在右上棋盤

if(ax>=

(mx+1)

&&ay>=

(my+1)

)flag=2;

//特殊點在右下棋盤

if(ax<=mx&&ay>=

(my+1)

)flag=3;

//特殊點在左下棋盤

for(

int i=

0;i<

4;i++)if

(i!=flag)dp[my+v[i][1

]][mx+v[i][0

]]=step;

//填充非特殊點的棋盤

step++

;for

(int i=

0;i<

4;i++)if

(i==1)

if(i==3)

if(i!=flag)

dfs(ox,oy,tx,ty,k-1)

;//非特殊點的棋盤

else

dfs(ox,oy,ax,ay,k-1)

;//特殊點的棋盤}}

intmain()

return0;

}

分治演算法 棋盤覆蓋

問題描述 在乙個2 k 2 k 個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。在棋盤覆蓋問題中,要用圖示的4種不同形態的l型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個l型骨牌不得重疊覆蓋。解題思路 分析 當k 0時,將2k 2k棋盤分...

分治 棋盤覆蓋問題

描述 在乙個2 k 2 k個方格組成的棋盤中,任意存在乙個特殊方格,那麼總有 4 k 1 3個l型骨牌可以將剩餘方格完全覆蓋。分析 將棋盤橫豎四等分,則特殊方格必存在於某一區域。存在特殊方格的區域自然可以完全覆蓋,其餘三個無特殊方格的區域必須去掉乙個方格方可用l型骨牌完全覆蓋。故,將三區域相鄰部分用...

分治法 棋盤覆蓋問題

棋盤覆蓋問題。有乙個2k 2k 的方格棋盤,恰有乙個方格是黑色的,其他為白色。你的任務是用包含3個方格的l型牌覆蓋所有白色方格。黑色方格不能被覆蓋,且任意乙個白色方格不能同時被兩個或更多牌覆蓋。如圖所示為l型牌的4種旋轉方式。分治三步驟 劃分問題 將 2 k 2k 的棋盤劃分為 2 k 1 2k 1...