4、棋盤覆蓋
阿新 • • 發佈:2018-12-30
(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)執行結果