問題描述
在乙個2^k * 2^k個方格組成的棋盤中,有乙個方格與其它的不同,若使用以下四種l型骨牌覆蓋除這個特殊方格的其它方格,如何覆蓋。
l型
棋盤
基本原理
實現的基本原理是將2^k * 2k的棋盤分成四塊2(k - 1) * 2^(k - 1)的子棋盤,特殊方格一定在其中的乙個子棋盤中,如果特殊方格在某乙個子棋盤中,繼續遞迴處理這個子棋盤,直到這個子棋盤中只有乙個方格為止如果特殊方格不在某乙個子棋盤中,將這個子棋盤中的相應的位置設為骨牌號,將這個無特殊方格的了棋盤轉換為有特殊方格的子棋盤,然後再遞迴處理這個子棋盤。以上原理如圖3所示。
**
package fenzhijiexianfa;
public class qipanfugai
int t = title++; // t表示l型骨牌的編號
int s = size / 2; // 分割棋盤
// 覆蓋左上角棋盤
if (dr < tr + s && dc < tc + s) else
// 覆蓋右上角棋盤
if (dr < tr + s && dc >= tc + s) else
// 覆蓋左下角棋盤
if (dr >= tr + s && dc < tc + s) else
// 覆蓋右下角棋盤
if (dr >= tr + s && dc >= tc + s) else
}public static void main(string args)
system.out.println();}}
static final int size = 4;
static int board = new int[size][size];
static int title = 1; // title表示l型骨牌的編號
}
執行結果
2 2 3 3
2 1 1 3
4 1 0 5
4 4 5 5
演算法學習:
學習思考問題的方式,這裡是如何發現這個規律的呢?由已知到未知的思考方向是什麼呢?
1.需求=>2.規律=>3.用**實現規律這是演算法完成的3個步驟。
第二部是關鍵,化繁為簡,是智慧型的體現。
第三部很麻煩,這是把演算法變成規律的過程,我們多做的是這部,除非你發明的演算法否則,第二部一般我們很少涉及,平時涉及到的也只是找到演算法而已。
分治法,棋盤覆蓋
分治法 棋盤覆蓋問題 問題描述 在乙個2k x 2k 即 2 k x 2 k 個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。在棋盤覆蓋問題中,要用4不同形態的l型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個l型骨牌不得重疊覆蓋。思想 將...
棋盤覆蓋(分治法)
include define maxnum 100 最大規模 using namespace std 變數設定 di 特定棋子橫座標 dj 特定棋子縱座標 hi 棋盤左上角橫座標 hj 棋盤左上角縱座標 tile 棋子序號 board 棋盤 maxnum 棋盤最大規模 int board maxnu...
分治法之棋盤覆蓋
一 問題描述 在乙個2k x 2k 即 2 k x 2 k 個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。在棋盤覆蓋問題中,要用圖示的 4種不同形態的 l型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個 l型骨牌不得重疊覆蓋。二 演算法思...