一、實驗目的與要求
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.手動執行最基本的演算...