演算法日誌記錄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表示:先鋪三個1(一塊l型骨牌),再鋪三個2,…,最後鋪三個5.2 2 1 3
5 1 1 4
5 5 4 4
**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...