JAVA實現棋盤覆蓋

2、實驗一棋盤覆蓋

實驗內容

輸入特殊方格的位置以及棋盤大小(2k個方格即輸入k),用分治法實現L型骨牌覆蓋磁盤問題,計算結果顯示棋盤骨牌覆蓋情況(用數字表示)

解題思路

1、採用分治法解決該問題,分治法是將一個規模很大的問題分解爲多個規模較小,且類似的子問題,然後遞歸地解決所有子問題,最後再由子問題的解決得到原問題的解決。
2、將2k×2k棋盤分割爲4個相等的子棋盤。特殊方格必位於4個較小子棋盤之一中,其餘3個子棋盤中無特殊方格。爲了將這3個無特殊方格的子棋盤轉化爲特殊棋盤,可以用一個L型骨牌覆蓋這3個較小棋盤的會合處,從而將原問題轉化爲4個較小規模的棋盤覆蓋問題。遞歸地使用這種分割,直至棋盤簡化爲棋盤1×1。

源代碼

package a棋盤覆蓋;

import java.util.Scanner;

/**
 * @author Draco-_-
 * @see 
 * @version 1.0
 * @date-time 2020-06-24 - 下午10:22:56
 */
public class ChessBoardCoverage {
	// 定義棋盤的大小:2^k,需要的骨牌數是:(4^k-1)/3
	private static int BOARD_SIZE = 8;
	// 定義一個二維數組用來模擬棋盤
	private static int[][] board = new int[BOARD_SIZE][BOARD_SIZE];
	// 定義一個全局變量,用來記錄骨牌的編號
	private static int tile = 1;

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("棋盤的大小爲:" + BOARD_SIZE);
		System.out.print("請輸入特殊方格所在的行號:");
		int dr = scanner.nextInt();
		System.out.print("請輸入特殊方格所在的列號:");
		int dc = scanner.nextInt();
		scanner.close();
		// 行號和列號與二位數組的下標相差 1
		chessBoard(0, 0, dr - 1, dc - 1, BOARD_SIZE);
		System.out.println("特殊方塊在第 " + dr + " 行第 " + dc + "列,覆蓋後的棋盤:");
		// 輸出棋盤
		printBoard();
	}

	/**
	 * 
	 * @param tr:棋盤左上角方格的行號
	 * @param tc:棋盤左上角方格的列號
	 * @param dr:特殊方格所在的行號
	 * @param dc:特殊方格所在的列號
	 * @param size:當前棋盤的大小
	 */
	private static void chessBoard(int tr, int tc, int dr, int dc, int size) {
		/* 1、當前棋盤的大小是 1 就返回 */
		if (size == 1) {
			return;
		}
		int t = tile++;
		// 分割棋盤,棋盤大小減半
		int s = size / 2;

		/* 2、覆蓋左上角子棋盤 */
		if (dr < tr + s && dc < tc + s) {
			// 特殊方格在此棋盤中
			chessBoard(tr, tc, dr, dc, s);
		} else {
			// 特殊方格不在此棋盤中,用 t號骨牌覆蓋右下角
			board[tr + s - 1][tc + s - 1] = t;
			// 覆蓋其餘方格
			chessBoard(tr, tc, tr + s - 1, tc + s - 1, s);
		}

		/* 3、覆蓋右上角子棋盤 */
		if (dr < tr + s && dc >= tc + s) {
			// 特殊方格在此棋盤中
			chessBoard(tr, tc + s, dr, dc, s);
		} else {
			// 特殊方格不在此棋盤中,用 t號骨牌覆蓋左下角
			board[tr + s - 1][tc + s] = t;
			// 覆蓋其餘方格
			chessBoard(tr, tc + s, tr + s - 1, tc + s, s);
		}

		/* 4、覆蓋左下角子棋盤 */
		if (dr >= tr + s && dc < tc + s) {
			// 特殊方格在此棋盤中
			chessBoard(tr + s, tc, dr, dc, s);
		} else {
			// 特殊方格不在此棋盤中,用 t號骨牌覆蓋右上角
			board[tr + s][tc + s - 1] = t;
			// 覆蓋其餘方格
			chessBoard(tr + s, tc, tr + s, tc + s - 1, s);
		}

		/* 5、覆蓋左下角子棋盤 */
		if (dr >= tr + s && dc >= tc + s) {
			// 特殊方格在此棋盤中
			chessBoard(tr + s, tc + s, dr, dc, s);
		} else {
			// 特殊方格不在此棋盤中,用 t號骨牌覆蓋右上角
			board[tr + s][tc + s] = t;
			// 覆蓋其餘方格
			chessBoard(tr + s, tc + s, tr + s, tc + s, s);
		}
	}

	/**
	 * @see 輸出棋盤
	 */
	private static void printBoard() {
		for (int i = 0; i < BOARD_SIZE; i++) {
			for (int j = 0; j < BOARD_SIZE; j++) {
				System.out.print(board[i][j] + "\t");
			}
			System.out.println("\n");
		}
	}

}

運行截圖

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章