1. 程式人生 > >4、棋盤覆蓋

4、棋盤覆蓋

(1)問題

在一個2^k×2^k個方格組成的棋盤中,若有一個方格與其他方格不同,則稱該方格為一特殊方格,且稱該棋盤為一個特殊棋盤.顯然特殊方格在棋盤上出現的位置有4^k種情形.因而對任何k≥0,有4^k種不同的特殊棋盤.
當k=3時,一共有64種特殊棋盤,圖1為其中的一種.


圖1

用下圖2所示的4種不同形態的L型骨牌覆蓋一個給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個L型骨牌不得重疊覆蓋.


圖2

(2)實現

package com.test;


public class Test {

	static int N = 8;
	
	static int ROW = 2;
	
	static int COLUM = 2;
	
	static int tile = 1;
	
	static int[][] board = new int[N][N];;
	
	public static void main(String[] args) {
		chessBoard(0, 0, ROW, COLUM, N);
		print();
		
	}
	private static void print() {
		for (int i = 0; i < board.length; i++) {
			for (int j = 0; j < board[i].length; j++) {
				System.out.print(board[i][j]+"\t");
			}
			System.out.println();
		}
	}
	/**
	 * 
	 * @param tr 棋盤左上角行號
	 * @param tc 棋盤左上角列號
	 * @param dr 特殊方格行號
	 * @param dc 特殊方格列號
	 * @param size 棋盤的邊長
	 */
	public static void chessBoard(int tr,int tc,int dr,int dc,int size){
		if (size == 1) {
			return;
		}
		int t = tile++;
		int s = size/2;
		//覆蓋左上角棋盤
		if (dr<tr+s&&dc<tc+s) {
			chessBoard( tr, tc, dr, dc, s);
		}else {
			board[tr+s-1][tc+s-1] = t;
			chessBoard(tr, tc, tr+s-1, tc+s-1, s);
		}
		//覆蓋右上角棋盤
		if (dr<tr+s&&dc>=tc+s) {
			chessBoard(tr, tc+s, dr, dc, s);
		}else {
			board[tr+s-1][tc+s] = t;
			chessBoard(tr, tc+s, tr+s-1, tc+s, s);
		}
		//覆蓋左下角棋盤
		if (dr>=tr+s&&dc<tc+s) {
			chessBoard(tr+s, tc, dr, dc, s);
		}else{
			board[tr+s][tc+s-1] = t;
			chessBoard(tr+s, tc, tr+s, tc+s-1, s);
		}
		//覆蓋右下角棋盤
		if (dr>=tr+s&&dc>=tc+s) {
			chessBoard(tr+s, tc+s, dr, dc, s);
		}else{
			board[tr+s][tc+s] = t;
			chessBoard(tr+s, tc+s, tr+s, tc+s, s);
		}
	}

}

(3)執行結果