Java基于分治算法實(shí)現(xiàn)的棋盤覆蓋問題示例
本文實(shí)例講述了Java基于分治算法實(shí)現(xiàn)的棋盤覆蓋問題。分享給大家供大家參考,具體如下:
在一個(gè)2^k * 2^k個(gè)方格組成的棋盤中,有一個(gè)方格與其它的不同,若使用以下四種L型骨牌覆蓋除這個(gè)特殊方格的其它方格,如何覆蓋。四個(gè)L型骨牌如下圖:

棋盤中的特殊方格如圖:

實(shí)現(xiàn)的基本原理是將2^k * 2^k的棋盤分成四塊2^(k - 1) * 2^(k - 1)的子棋盤,特殊方格一定在其中的一個(gè)子棋盤中,如果特殊方格在某一個(gè)子棋盤中,繼續(xù)遞歸處理這個(gè)子棋盤,直到這個(gè)子棋盤中只有一個(gè)方格為止如果特殊方格不在某一個(gè)子棋盤中,將這個(gè)子棋盤中的相應(yīng)的位置設(shè)為骨牌號(hào),將這個(gè)無特殊方格的了棋盤轉(zhuǎn)換為有特殊方格的子棋盤,然后再遞歸處理這個(gè)子棋盤。以上原理如圖所示:

具體代碼如下:
package demo;
public class Chess {
/*tr表示棋盤左上角行號(hào)
tc表示棋盤左上角列號(hào)
dr表示特殊棋盤的行號(hào)
dc表示特殊棋盤的列號(hào)*/
public static void ChessBoard(int tr, int tc, int dr, int dc, int size) {
if(size == 1) {
return;
}
int t = title ++;
int s = size/2;
//覆蓋左上角子棋盤
if(dr < tr + s && dc < tc +s) {
//特殊方格在此棋盤中
ChessBoard(tr, tc, dr, dc, s);
}
else {
//此棋盤中無特殊方格,用t號(hào)L型骨牌覆蓋右下角
Board[tr + s - 1][tr + 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 {//此棋盤中午特殊方格,用t號(hào)L型骨牌覆蓋左下角
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 {
//此棋盤中無特殊方格,用t號(hào)L型骨牌覆蓋右上角
Board[tr + s][tr + s -1] = t;
//覆蓋其余方格
ChessBoard(tr, tc, tr + s , tc + s - 1, s);
}
//覆蓋右下角子棋盤
if(dr >= tr + s && dc >= tc + s) {
//特殊方格在此棋盤中
ChessBoard(tr + s, tc+s, dr, dc, s);
}
else {//此棋盤中無特殊方格,用t號(hào)L型骨牌覆蓋左上角
Board[tr + s ][tc + s] = t;
//覆蓋其余方格
ChessBoard(tr + s, tc + s, tr + s , tc + s, s);
}
}
@SuppressWarnings("static-access")
public static void main(String args[]) {
System.out.println("腳本之家測(cè)試結(jié)果:");
Board[2][2] = 0;
Chess ch = new Chess();
ch.ChessBoard(0, 0, 2, 2, size);
for(int i = 0; i < size; ++ i) {
for(int j = 0; j < size; j++) {
System.out.print(Board[i][j] + " ");
}
System.out.println();
}
}
static final int size = 4;
static int title = 1;
static int Board[][] = new int[size][size];
}
運(yùn)行結(jié)果:

更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
相關(guān)文章
Java SSM整合開發(fā)統(tǒng)一結(jié)果封裝詳解
這篇文章主要介紹了Java SSM整合開發(fā)實(shí)現(xiàn)統(tǒng)一結(jié)果封裝,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
如何利用NetworkInterface獲取服務(wù)器MAC地址
今天介紹一種通用的跨平臺(tái)的操作方式,那就是JDK自帶的NetworkInterface接口,該接口在JDK1.4已經(jīng)出現(xiàn),但是功能比較少,JDK1.6之后新增了不少新功能,比較不錯(cuò)2013-08-08
詳解Java多線程編程中CountDownLatch阻塞線程的方法
在Java中和ReadWriteLock.ReadLock一樣,CountDownLatch的本質(zhì)也是一個(gè)"共享鎖",這里我們就來詳解Java多線程編程中CountDownLatch阻塞線程的方法:2016-07-07
一文帶你學(xué)會(huì)規(guī)則引擎Drools的應(yīng)用
Drools?就是一個(gè)開源的業(yè)務(wù)規(guī)則引擎,可以很容易地與?spring?boot?應(yīng)用程序集成,這篇文章就來和大家詳細(xì)聊聊Drools的具體應(yīng)用,需要的可以參考一下2023-03-03
JAVA編程實(shí)現(xiàn)TCP網(wǎng)絡(luò)通訊的方法示例
這篇文章主要介紹了JAVA編程實(shí)現(xiàn)TCP網(wǎng)絡(luò)通訊的方法,簡(jiǎn)單說明了TCP通訊的原理并結(jié)合具體實(shí)例形式分析了java實(shí)現(xiàn)TCP通訊的步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-08-08
MyBatis深入解讀動(dòng)態(tài)SQL的實(shí)現(xiàn)
動(dòng)態(tài) SQL 是 MyBatis 的強(qiáng)大特性之一。如果你使用過 JDBC 或其它類似的框架,你應(yīng)該能理解根據(jù)不同條件拼接 SQL 語句有多痛苦,例如拼接時(shí)要確保不能忘記添加必要的空格,還要注意去掉列表最后一個(gè)列名的逗號(hào)。利用動(dòng)態(tài) SQL,可以徹底擺脫這種痛苦2022-04-04
Java 高并發(fā)九:鎖的優(yōu)化和注意事項(xiàng)詳解
本文主要介紹Java高并發(fā)鎖的優(yōu)化和注意事項(xiàng),這里整理了詳細(xì)的資料,并講解了 1. 鎖優(yōu)化的思路和方法 2. 虛擬機(jī)內(nèi)的鎖優(yōu)化 3. 一個(gè)錯(cuò)誤使用鎖的案例 4. ThreadLocal及其源碼分析等知識(shí),有需要的小伙伴可以參考下2016-09-09
Idea創(chuàng)建springboot不能選擇java8的解決
在IDEA 2023版本創(chuàng)建Spring Boot項(xiàng)目時(shí),發(fā)現(xiàn)沒有Java 8選項(xiàng),只有Java 17和Java 20,解決方法包括:通過修改服務(wù)器URL(推薦)或直接在創(chuàng)建后修改pom.xml文件中的Spring Boot和Java版本2025-01-01

