基于Java實(shí)現(xiàn)馬踏棋盤游戲算法
馬踏棋盤很好實(shí)現(xiàn),但有時(shí)運(yùn)行起來(lái)特別慢,還可能出不來(lái)結(jié)果,最常用的就是深度優(yōu)先遍歷+回溯,相信大家都學(xué)過(guò)數(shù)據(jù)結(jié)構(gòu),對(duì)圖的深度遍歷都有了解,下面就是代碼的實(shí)現(xiàn),如果對(duì)代碼理解有困難,可以先熟悉一下圖的深度優(yōu)先遍歷
大家可以把棋盤改小一些測(cè)試,8x8的確實(shí)很慢
import java.util.Arrays; /** ?* 騎士周游問(wèn)題 ?* @author LM_Code ?* @create 2019-03-17-18:57 ?*/ public class KnightProblem { ? ? static final int SIZE = 8;//設(shè)置棋盤的行數(shù)和列數(shù)>=5時(shí)才有解 ? ? static final int[][] A = new int[SIZE][SIZE];//初始化棋盤,數(shù)組中所有值默認(rèn)為0 ? ? static final int[] NEXT= new int[]{1, 2};//設(shè)置馬的下一步,用空間為2的數(shù)組代替x,y坐標(biāo) ? ? public static void main(String[] args) { ? ? ? ? //判斷此點(diǎn)是否能走完整個(gè)棋盤 ? ? ? ? if(method(NEXT, 1)){//能,則輸出棋盤軌跡 ? ? ? ? ? ? for (int i = 0; i < A.length; i++) { ? ? ? ? ? ? ? ? System.out.println(Arrays.toString(A[i])); ? ? ? ? ? ? } ? ? ? ? }else{//不能,提示無(wú)解 ? ? ? ? ? ? System.out.println("此起點(diǎn)無(wú)解"); ? ? ? ? } ? ? } ? ? //傳入下一步NEXT,和并表明下一步是第幾步tag,返回此點(diǎn)是否能走完棋盤(有解) ? ? public static boolean method(int[] NEXT, int tag){ ? ? ? ? int[] current = new int[]{NEXT[0], NEXT[1]};//將當(dāng)前步存入本次方法調(diào)用的局部變量 ? ? ? ? A[current[0]][current[1]] = tag;//把馬跳到當(dāng)前位置,并標(biāo)記為是第幾步 ? ? ? ? // 如果是最后一步,遞歸結(jié)束 ? ? ? ? if(tag == SIZE*SIZE){ ? ? ? ? ? ? return true; ? ? ? ? } ? ? ? ? //如果不是最后一步,下一步有8中可能 ? ? ? ? for (int i = 0; i < 8; i++) { ? ? ? ? ? ? //下一步的第i種情況是否可走 ? ? ? ? ? ? if(canGo(current, i)){//如果可以走,繼續(xù)遞歸 ? ? ? ? ? ? ? ? //判斷此時(shí)的下一步,是否能走完棋盤 ? ? ? ? ? ? ? ? if(method(NEXT, tag+1)){//能,返回true,遞歸結(jié)束 ? ? ? ? ? ? ? ? ? ? return true; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? //此時(shí)的下一步不能走完棋盤,則繼續(xù)尋找第i+1種情況的下一步是否有解 ? ? ? ? ? ? } ? ? ? ? ? ? //此時(shí)的下一步無(wú)解,則尋找第i+1種情況是否有解 ? ? ? ? } ? ? ? ? //如果當(dāng)前步無(wú)法走完棋盤(無(wú)解) ? ? ? ? A[current[0]][current[1]] = 0;//回溯:撤銷當(dāng)前步,當(dāng)前步賦值為0 ? ? ? ? return false;//返回false,回到上一步,表明此步無(wú)解 ? ? } ? ? //判斷下一步是否能走,下一步有8中情況0-7,傳入當(dāng)前步arr,判斷是否有第count種情況的下一步 ? ? public static boolean canGo(int[] arr,int count){ ? ? ? ? switch (count){ ? ? ? ? ? ? case 0 : ? ? ? ? ? ? ? ? if(arr[0]-1>=0&&arr[1]+2<SIZE&&A[arr[0]-1][arr[1]+2]==0) { ? ? ? ? ? ? ? ? ? ? NEXT[0] = arr[0]-1; ? ? ? ? ? ? ? ? ? ? NEXT[1] = arr[1]+2; ? ? ? ? ? ? ? ? ? ? return true; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? case 1 : ? ? ? ? ? ? ? ? if(arr[0]+1<SIZE&&arr[1]+2<SIZE&&A[arr[0]+1][arr[1]+2]==0){ ? ? ? ? ? ? ? ? ? ? NEXT[0] = arr[0]+1; ? ? ? ? ? ? ? ? ? ? NEXT[1] = arr[1]+2; ? ? ? ? ? ? ? ? ? ? return true; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? case 2 : ? ? ? ? ? ? ? ? if(arr[0]+2<SIZE&&arr[1]+1<SIZE&&A[arr[0]+2][arr[1]+1]==0){ ? ? ? ? ? ? ? ? ? ? NEXT[0] = arr[0]+2; ? ? ? ? ? ? ? ? ? ? NEXT[1] = arr[1]+1; ? ? ? ? ? ? ? ? ? ? return true; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? case 3 : ? ? ? ? ? ? ? ? if(arr[0]+2<SIZE&&arr[1]-1>=0&&A[arr[0]+2][arr[1]-1]==0){ ? ? ? ? ? ? ? ? ? ? NEXT[0] = arr[0]+2; ? ? ? ? ? ? ? ? ? ? NEXT[1] = arr[1]-1; ? ? ? ? ? ? ? ? ? ? return true; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? case 4 : ? ? ? ? ? ? ? ? if(arr[0]+1<SIZE&&arr[1]-2>=0&&A[arr[0]+1][arr[1]-2]==0){ ? ? ? ? ? ? ? ? ? ? NEXT[0] = arr[0]+1; ? ? ? ? ? ? ? ? ? ? NEXT[1] = arr[1]-2; ? ? ? ? ? ? ? ? ? ? return true; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? case 5 : ? ? ? ? ? ? ? ? if(arr[0]-1>=0&&arr[1]-2>=0&&A[arr[0]-1][arr[1]-2]==0){ ? ? ? ? ? ? ? ? ? ? NEXT[0] = arr[0]-1; ? ? ? ? ? ? ? ? ? ? NEXT[1] = arr[1]-2; ? ? ? ? ? ? ? ? ? ? return true; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? case 6 : ? ? ? ? ? ? ? ? if(arr[0]-2>=0&&arr[1]-1>=0&&A[arr[0]-2][arr[1]-1]==0){ ? ? ? ? ? ? ? ? ? ? NEXT[0] = arr[0]-2; ? ? ? ? ? ? ? ? ? ? NEXT[1] = arr[1]-1; ? ? ? ? ? ? ? ? ? ? return true; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? case 7 : ? ? ? ? ? ? ? ? if(arr[0]-2>=0&&arr[1]+1<SIZE&&A[arr[0]-2][arr[1]+1]==0){ ? ? ? ? ? ? ? ? ? ? NEXT[0] = arr[0]-2; ? ? ? ? ? ? ? ? ? ? NEXT[1] = arr[1]+1; ? ? ? ? ? ? ? ? ? ? return true; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? default: ? ? ? ? } ? ? ? ? return false; ? ? } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
spring中向一個(gè)單例bean中注入非單例bean的方法詳解
Spring是先將Bean對(duì)象實(shí)例化之后,再設(shè)置對(duì)象屬性,所以會(huì)先調(diào)用他的無(wú)參構(gòu)造函數(shù)實(shí)例化,每個(gè)對(duì)象存在一個(gè)map中,當(dāng)遇到依賴,就去map中調(diào)用對(duì)應(yīng)的單例對(duì)象,這篇文章主要給大家介紹了關(guān)于spring中向一個(gè)單例bean中注入非單例bean的相關(guān)資料,需要的朋友可以參考下2021-07-07Java 實(shí)現(xiàn)LZ78壓縮算法的示例代碼
這篇文章主要介紹了Java 實(shí)現(xiàn)LZ78壓縮算法的示例代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05Java用split分割含一個(gè)或多個(gè)空格的字符串案例
這篇文章主要介紹了Java用split分割含一個(gè)或多個(gè)空格的字符串案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)過(guò)來(lái)看看吧2020-09-09Java使用JDBC連接Oracle_MSSQL實(shí)例代碼
這篇文章主要介紹了Java使用JDBC連接Oracle_MSSQL實(shí)例代碼,需要的朋友可以參考下2014-01-01window?下?win10?jdk8安裝與環(huán)境變量的配置過(guò)程
這篇文章主要介紹了window?下?win10?jdk8安裝與環(huán)境變量的配置,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08