分治策略之棋盤覆蓋的C 實現

2021-08-27 11:46:17 字數 1745 閱讀 9871

當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...