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

2021-09-24 19:34:41 字數 1543 閱讀 2146

一、實驗目的與要求

1、掌握棋盤覆蓋問題的演算法;

2、初步掌握分治演算法

二、實驗題:

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

輸入:輸入第一行包括乙個整數k,第二行兩個整數x,y代表特殊點座標(從1開始)。

輸出:輸出乙個2k×2k的矩陣代表結果,0表示特殊點。

****** input

2

1 2

****** output

2  0  3  3

2  2  1  3

4  1  1  5

4  4  5  5

三、實現思想

方陣的邊數為2^n,將方陣四等分,在其中乙個等分塊中加入乙個特殊方塊,在分割線處標記l型骨,使缺口對著有著特殊方塊的等分塊。

四、實現**

#includeusing namespace std;

int title=1,a[100][100];

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

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

chessboard(tr+s,tc+s,dr,dc,s);

else

}int main()

{    int m,n,k;

cin>>k;

for(int i=1;i<=pow(2,k);i++)

for(int j=1;j<=pow(2,k);j++)

a[i][j]=-1;

cin>>m>>n;

a[m][n]=0;

chessboard(1,1,m,n,pow(2,k));

for(int i=1;i<=pow(2,k);i++)

{for(int j=1;j<=pow(2,k);j++)

printf("%2d ",a[i][j]);

cout<五、實驗結果

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

問題描述 在2 k 2 k個方格組成的棋盤中,若恰有乙個方格與其他方格不一樣,則稱這個方格為特殊方格,現在用四種不同形狀的l型骨牌來覆蓋該棋盤中除了特殊方格以外的其他方格。分析 把該棋盤分成四個2 k 1 2 k 1 個子棋盤,則特殊方格一定在某乙個子棋盤中。其餘三個子棋盤無特殊方格。為了用分治策略...

棋盤覆蓋 演算法分析 設計與實現(Java)

該篇雖然與很多的部落格 解說一樣講的都是棋盤覆蓋的解法。但是,該篇更多地傾向於 證明 這也是我與很多讀者都想知道的,而不是開篇就上 目錄0,問題描述.1 1,相關部落格.1 2,提出命題.1 3,命題證明.1 4,分析演算法.2 5,實現.2 k n k n 且棋盤中只有乙個特殊方塊時,一定可以用相...

計算機演算法設計與分析解題心得

先觀察問題的結構 解的形式,再設計演算法 能分解成子問題,是非常有效的資訊 優化問題時,下界很重要。給乙個問題,從最簡單的case入手 觀察input的關鍵結構,看能否分 能否combine 觀察output,不要堅持追求optimal,追求sub optimal。sample.手動執行最基本的演算...