當k>0時,將
//全域性整型變數,用來表示l型骨牌的編號
const int board_size=4;
int tile=1;
int board[4][4];
void chessboard(int tr,int tc,int dr,int dc,int size)
if(size==1)return;
//每呼叫一次,使用的骨牌的數量+1
int t = tile++,
s=size/2;//分割棋盤
//1.覆蓋左上角的棋盤
if(dr//特殊的方格在此棋盤中
chessboard(tr,tc,dr,dc,s);
else
//此棋盤中無特殊的方格
//用t號l型骨牌覆蓋右下角
board[tr+s-1][tc+s-1]=t;
//覆蓋其餘的方格
chessboard(tr,tc,tr+s-1,tc+s-1,s);
//2.覆蓋右上角的棋盤
if(dr=tc+s)
//特殊的方格在此棋盤中
chessboard(tr,tc+s,dr,dc,s);
else
//此棋盤中無特殊的方格
//用t號l型骨牌覆蓋左下角
board[tr+s-1][tc+s]=t;
//覆蓋其餘的方格
chessboard(tr,tc+s,tr+s-1,tc+s,s);
//3.覆蓋左下角的棋盤
if(dr>=tr+s&&dc//特殊的方格在此棋盤中
chessboard(tr+s,tc,dr,dc,s);
else
//此棋盤中無特殊的方格
//用t號l型骨牌覆蓋右下角
board[tr+s][tc+s-1]=t;
//覆蓋其餘的方格
chessboard(tr+s,tc,tr+s,tc+s-1,s);
//4.覆蓋右下角的子棋盤
if(dr>=tr+s&&dc>=tc+s)
//特殊的方格在此棋盤中
chessboard(tr+s,tc+s,dr,dc,s);
else
//此棋盤中無特殊的方格
//用t號l型骨牌覆蓋右下角
board[tr+s][tc+s]=t;
//覆蓋其餘的方格
分治策略之棋盤覆蓋問題
1 引出 首先用合併排序來引出我們今天的主角,合併排序即使用了分治的策略,它將所要排序的區間劃分為2個子區間,將這兩個子區間分別進行遞迴排好順序,然後合併這兩個子區間 合併過程運用了簡單的雙指標演算法 即獲得原問題的解。其實棋盤覆蓋問題也是這樣的。2 主角登場 問題 在乙個2k 2k個方格組成的棋盤...
分治法之棋盤覆蓋
一 問題描述 在乙個2k x 2k 即 2 k x 2 k 個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。在棋盤覆蓋問題中,要用圖示的 4種不同形態的 l型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個 l型骨牌不得重疊覆蓋。二 演算法思...
分治與遞迴之棋盤覆蓋
棋盤覆蓋問題要求在2 k 2 k 個方格組成的棋盤中,給定任意乙個特殊點,實現對除該特殊點的棋盤實現全覆蓋。如圖所示 如下 include include using namespace std int title 1 設定l型骨牌編號 int board 2049 2049 void chessb...