演算法設計與分析之分治法 棋盤覆蓋

2021-07-30 19:51:46 字數 1037 閱讀 8965

棋盤覆蓋問題要求在2^k * 2^k 個方格組成的棋盤中,你給定任意乙個特殊點,用一種方案實現對除該特殊點的棋盤實現全覆蓋。

建立模型如圖:

解決方案就是利用分治法,將方形棋盤分成4部分,如果該特殊點在某一部分,我們就去遞迴他,如果不在某一部分,我們假設乙個點為特殊點,同樣遞迴下去,知道全覆蓋。

左上角的子棋盤(若不存在特殊方格

):則將該子棋盤右下角的那個方格假設為特殊方格;

右上角的子棋盤(若不存在特殊方格):則將該子棋盤左下角的那個方格假設為特殊方格;

左下角的子棋盤(若不存在特殊方格):則將該子棋盤右上角的那個方格假設為特殊方格;

右下角的子棋盤(若不存在特殊方格):則將該子棋盤左上角的那個方格假設為特殊方格;

#include #include #include using namespace std;

//tr表示棋盤左上角行號

//tc表示棋盤左上角列號

//dr表示特殊棋盤的行號

//dc表示特殊棋盤的列號

//size = 2^k

//棋盤的規格為2^k * 2^k

const int size = 8;

static int tt = 1;

static int board[size][size];

void chessboard(int tr,int tc,int dr,int dc,int size)

//覆蓋左下角子棋盤

if(dr >= tr + s && dc < tc + s)

else

//覆蓋右下角子棋盤

演算法設計與分析 分治法 棋盤覆蓋問題

tr 子棋盤x座標,tc 子棋盤y座標,dr 特殊方格x座標,dc 特殊方格y座標,size 棋盤邊長 初始tr,tc 0 public void chessboard int tr,int tc,int dr,int dc,int size 覆蓋右下角子棋盤 if dr tr s dc tc s ...

分治法,棋盤覆蓋

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

分治法 棋盤覆蓋

問題描述 在乙個2 k 2 k個方格組成的棋盤中,有乙個方格與其它的不同,若使用以下四種l型骨牌覆蓋除這個特殊方格的其它方格,如何覆蓋。l型 棋盤 基本原理 實現的基本原理是將2 k 2k的棋盤分成四塊2 k 1 2 k 1 的子棋盤,特殊方格一定在其中的乙個子棋盤中,如果特殊方格在某乙個子棋盤中,...