演算法 遞迴 棋盤覆蓋問題

2021-07-22 22:34:12 字數 1714 閱讀 1421

(1):最小情況

(2):原問題與子問題同型

(3):原問題的解可以用子問題的解來構造

在乙個2的k次方 x 2的k次方 (此處數學公式的插入待修改)個方格的棋盤中,恰有乙個方格與其他方格不同,則稱該方格為特殊方格,在棋盤覆蓋問題中,要用l型骨牌

覆蓋乙個帶有乙個特殊方格的棋盤,特殊方塊上不能覆蓋骨牌,其他方塊上必須有骨牌覆蓋,且任意兩個骨牌不能重疊覆蓋。

1、 使用乙個二維陣列表示棋盤並初始棋盤的每個元素為0

在放置骨牌時同乙個骨牌所佔的三個方塊置為同乙個數

因為陣列下標是從0開始的原因,所以我們在第一次傳入使用者所輸入的值時刻意減掉一

2、 我們把棋盤分為左上,左下,右上,右下四個區域,分開去處理這四個區域

在處理左上時,根據方塊的座標判斷特殊方塊是否在此區域內,如果在,那麼再遞迴呼叫棋盤覆蓋函式,如果不在,那麼在

此區域的右下角(也就是最靠近棋盤中心的位置)放置骨牌的三分之一。將此方塊當作特殊方塊,再把這個區域當作棋盤呼叫棋盤覆蓋函式

處理其他三個區域時原理相同。

到棋盤為1x1時便退出。

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

2627

2829

3031

3233

3435

3637

3839

4041

4243

4445

4647

4849

5051

5253

5455

5657

5859

6061

6263

6465

6667

6869

7071

7273

7475

7677

7879

8081

8283

84

#include

#include

#include

int chessboard(int x, int y, int dx, int dy, int size, int **map);

int title = 1;

int main()

for(i = 0; i < size; i++)

}chessboard( 0, 0, dx - 1, dy - 1, size, map); //呼叫函式

for(i = 0; i < size; i++)

printf("\n");

}return 0;

}int chessboard(int x, int y, int dx, int dy, int size, int **map)

else

//覆蓋棋盤右上角 (方法如左上角)

if(dx < x + s && dy >= y + s)else

//覆蓋棋盤左下角

if(dx >= x + s && dy < y + s)else

//覆蓋棋盤右下角

if(dx >= x + s && dy >= y + s)else

}

感謝閱讀,歡迎指正。

棋盤覆蓋問題的遞迴演算法實現

問題描述 遞迴與分治策略演算法,用 4 種不同形態的 l 型骨牌覆蓋乙個給定的特殊棋盤上除特殊方格以外的所有方格,且任何 2 個 l 型骨牌不得重疊覆蓋。輸入資料由程式執行後的介面中的編輯框中輸入遊戲規模,特殊方格的位置。將覆蓋的結果在視窗中顯示出來。輸入輸出 通過鍵盤輸入 k 值和特殊方格位置,輸...

遞迴特訓 棋盤覆蓋問題

解題思路 這一題使用遞迴的解法比較便於理解,這裡可以採用前面使用過的分治演算法,將整個棋盤分成四個部分。直接劃分後只有乙個部分會有黑色圖塊,而其餘三個部分則都是白色圖塊。這裡可以採取人為新增的方式。在其餘三個部分增加乙個骨牌覆蓋到三個部分,這樣每個區塊又都會包含黑色圖塊,然後分部分繼續求解。遞迴的返...

棋盤覆蓋問題(分治,遞迴)

在乙個2 k 2 k個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。該棋盤為特殊棋盤,紅色的方格為特殊方格。棋盤覆蓋問題是指,要用圖2中的4種不同形態的l型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個l型骨牌不得重疊覆蓋。該問題就是在考察...