最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實現(xiàn)馬踏棋盤算法

 更新時間:2022年02月14日 15:24:36   作者:CmdSmith  
這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)馬踏棋盤算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Java實現(xiàn)馬踏棋盤的具體代碼,供大家參考,具體內(nèi)容如下

馬在某個點(diǎn)最多可能有8種走法,用遞歸和回溯實現(xiàn)。

注:代碼中,查找下一個可走坐標(biāo)是從右下第一個開始的,也就是圖中的4??梢酝ㄟ^修改a,b...h的值來改變順序。

代碼:

/**
?* 馬踏棋盤算法?
?* 遞歸和回溯
?*
?*/
public class HorseStep {
?? ?
?? ?public static int X = 8;
?? ?public static int Y = 8;
?? ?
?? ?public static int returnCount = 0;
?? ?
?? ?/**
?? ? * 棋盤
?? ? */
?? ?public static int chess[][] = new int[X][Y];
?? ?
?? ?
?? ?/**
?? ? * 找到基于(x,y)位置的下一個可走位置
?? ? * @param x
?? ? * @param y
?? ? * @param count
?? ? * @return
?? ? */
?? ?public static int nextxy(XY xy,int count){
?? ??? ?
?? ??? ?final int a=0,
?? ??? ??? ??? ?b=1,
?? ??? ??? ??? ?c=2,
?? ??? ??? ??? ?d=3,
?? ??? ??? ??? ?e=4,
?? ??? ??? ??? ?f=5,
?? ??? ??? ??? ?g=6,
?? ??? ??? ??? ?h=7;
?? ??? ?
?? ??? ?int x = xy.getX();
?? ??? ?int y = xy.getY();
?? ??? ?
?? ??? ?int returnInt = 0;
?? ??? ?
?? ??? ?switch (count) {
?? ??? ?
//?? ??? ?從以x,y為軸心的 右下 開始
?? ??? ?
?? ??? ?case a:
?? ??? ??? ?if( x+2<=X-1 && y+1<=Y-1 && chess[y+1][x+2]==0){
?? ??? ??? ??? ?x +=2;
?? ??? ??? ??? ?y +=1;
?? ??? ??? ??? ?returnInt = 1;
?? ??? ??? ?}
?? ??? ??? ?
?? ??? ??? ?break;
?? ??? ??? ?
?? ??? ?case b:
?? ??? ??? ?if( x+1<=X-1 && y+2<=Y-1 && chess[y+2][x+1]==0){
?? ??? ??? ??? ?x +=1;
?? ??? ??? ??? ?y +=2;
?? ??? ??? ??? ?returnInt = 1;
?? ??? ??? ?}
?? ??? ??? ?
?? ??? ??? ?break;
?? ??? ??? ?
?? ??? ?case c:
?? ??? ??? ?if( x-1>=0 && y+2<=Y-1 && chess[y+2][x-1]==0){
?? ??? ??? ??? ?x -=1;
?? ??? ??? ??? ?y +=2;
?? ??? ??? ??? ?returnInt = 1;
?? ??? ??? ?}
?? ??? ??? ?
?? ??? ??? ?break;
?? ??? ??? ?
?? ??? ?case d:
?? ??? ??? ?if( x-2>=0 && y+1<=Y-1 && chess[y+1][x-2]==0){
?? ??? ??? ??? ?x -=2;
?? ??? ??? ??? ?y +=1;
?? ??? ??? ??? ?returnInt = 1;
?? ??? ??? ?}
?? ??? ??? ?
?? ??? ??? ?break;
?? ??? ?
?? ??? ?case e:
?? ??? ??? ?if( x-2>=0 && y-1>=0 && chess[y-1][x-2]==0){
?? ??? ??? ??? ?x -=2;
?? ??? ??? ??? ?y -=1;
?? ??? ??? ??? ?returnInt = 1;
?? ??? ??? ?}
?? ??? ??? ?
?? ??? ??? ?break;
?? ??? ??? ?
?? ??? ?case f:
?? ??? ??? ?if( x-1>=0 && y-2>=0 && chess[y-2][x-1]==0){
?? ??? ??? ??? ?x -=1;
?? ??? ??? ??? ?y -=2;
?? ??? ??? ??? ?returnInt = 1;
?? ??? ??? ?}
?? ??? ??? ?
?? ??? ??? ?break;
?? ??? ??? ?
?? ??? ?case g:
?? ??? ??? ?if( x+1<=X-1 && y-2>=0 && chess[y-2][x+1]==0){
?? ??? ??? ??? ?x +=1;
?? ??? ??? ??? ?y -=2;
?? ??? ??? ??? ?returnInt = 1;
?? ??? ??? ?}
?? ??? ??? ?
?? ??? ??? ?break;
?? ??? ??? ?
?? ??? ?case h:
?? ??? ??? ?if( x+2<=X-1 && y-1>=0 && chess[y-1][x+2]==0){
?? ??? ??? ??? ?x +=2;
?? ??? ??? ??? ?y -=1;
?? ??? ??? ??? ?
?? ??? ??? ??? ?returnInt = 1;
?? ??? ??? ?}
?? ??? ??? ?break;
?? ??? ??? ?
?? ??? ?default:
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?
?? ??? ?if(returnInt == 1){
?? ??? ??? ?xy.setX(x);
?? ??? ??? ?xy.setY(y);
?? ??? ??? ?
?? ??? ??? ?return 1;
?? ??? ?}
?
?? ??? ?return 0;
?? ?}
?? ?
?? ?/**
?? ? * 打印棋盤
?? ? */
?? ?public static void print(){
?? ??? ?for(int i=0;i<X;i++){
?? ??? ??? ?for(int j=0;j<Y;j++){
?? ??? ??? ??? ?
?? ??? ??? ??? ?if(chess[i][j]<10)
?? ??? ??? ??? ??? ?System.out.print(chess[i][j]+" ?");
?? ??? ??? ??? ?else
?? ??? ??? ??? ??? ?System.out.print(chess[i][j]+" ");
?? ??? ??? ??? ?
?? ??? ??? ?}
?? ??? ??? ?System.out.println();
?? ??? ?}
?? ??? ?
?? ?}
?? ?
?? ?/**
?? ? * 深度優(yōu)先遍歷棋盤
?? ? * @param x
?? ? * @param y
?? ? * @param tag
?? ? * @return
?? ? * (x,y)為位置坐標(biāo)
?? ? * tag是標(biāo)記變量,每走一步 tag+1。
?? ? */
?? ?public static int TravelChessBoard(XY xy,int tag){
?? ??? ?
//?? ??? ?馬在某個點(diǎn)有八種可能的方向,用來約束查找小于八種的變量
?? ??? ?Integer count = 0;
?? ??? ?
//?? ??? ?馬所在位置是否可以再跳向下一個位置,0有,1無(條件:1,不出邊界,2.沒有走過)
?? ??? ?int haveNextXy = 0;
?? ??? ?
?? ??? ?int x = xy.getX();
?? ??? ?int y = xy.getY();
?? ??? ?
//?? ??? ?x是橫軸,y是豎軸,左上角為0,0點(diǎn),往右和往下遞增
?? ??? ?chess[y][x] = tag;
?? ??? ?
//?? ??? ?最后一步,遞歸的終止條件
?? ??? ?if(X*Y == tag){
//?? ??? ??? ?打印棋盤
?? ??? ??? ?print();
?? ??? ??? ?return 1;
?? ??? ?}
?? ??? ?
//?? ??? ?找到馬的下一個可走坐標(biāo)(x1,y1),如果找到為1,否則為0.
?? ??? ?haveNextXy = nextxy(xy, count);
?? ??? ?
?? ??? ?while( 0==haveNextXy && count<7){
?? ??? ??? ?count ++;
?? ??? ??? ?haveNextXy = nextxy(xy, count);
?? ??? ?}
?? ??? ?
?? ??? ?while(haveNextXy==1){
?? ??? ??? ?if(TravelChessBoard(xy, tag+1)==1){
?? ??? ??? ??? ?return 1;
?? ??? ??? ?}
?? ??? ??? ?
//?? ??? ??? ?回退后,把當(dāng)前點(diǎn)也設(shè)置為回退后的位置
?? ??? ??? ?xy.setX(x);
?? ??? ??? ?xy.setY(y);
?? ??? ??? ?
?? ??? ??? ?count++;
?? ??? ??? ?
//?? ??? ??? ?找到馬的下一個可走坐標(biāo)(x1,y1),如果找到flag=1,否則為0.
?? ??? ??? ?haveNextXy = nextxy(xy, count);
?? ??? ??? ?
?? ??? ??? ?while( 0==haveNextXy && count<7){
?? ??? ??? ??? ?count ++;
?? ??? ??? ??? ?haveNextXy = nextxy(xy, count);
?? ??? ??? ?}
?? ??? ?}
?? ??? ?
//?? ??? ?回退
?? ??? ?if(haveNextXy==0){
?? ??? ??? ?chess[y][x]=0;
?? ??? ??? ?returnCount++;
?? ??? ?}
?? ??? ?
?? ??? ?return 0 ;
?? ?}
?? ?
?? ?public static void main(String[] args) {
?? ??? ?long begin = System.currentTimeMillis();
?? ??? ?
//?? ??? ?馬所在位置的坐標(biāo),x是橫軸,y是豎軸,左上角為0,0點(diǎn),往右和往下遞增
?? ??? ?XY xy = new XY();
?? ??? ?xy.setX(1);
?? ??? ?xy.setY(0);
?? ??? ?
?? ??? ?if(TravelChessBoard(xy, 1)==0){
?? ??? ??? ?System.out.println("馬踏棋盤失敗");
?? ??? ?}
?? ??? ?
?? ??? ?long time = System.currentTimeMillis()-begin;
?? ??? ?
?? ??? ?System.out.println("耗時"+time+"毫秒");
?? ??? ?System.out.println(returnCount);
?? ?}
?? ?
}
?
?
class XY{
?? ?private int x;
?? ?private int y;
?? ?public int getX() {
?? ??? ?return x;
?? ?}
?? ?public void setX(int x) {
?? ??? ?this.x = x;
?? ?}
?? ?public int getY() {
?? ??? ?return y;
?? ?}
?? ?public void setY(int y) {
?? ??? ?this.y = y;
?? ?}
?? ?
?? ?
}

結(jié)果:

如果從(0,0)開始的話

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解netty中常用的xml編碼解碼器

    詳解netty中常用的xml編碼解碼器

    這篇文章主要介紹了netty中常用的xml編碼解碼器,進(jìn)行frame拆分可以使用XmlFrameDecoder,進(jìn)行xml文件內(nèi)容的解析則可以使用XmlDecoder,接下來我們會詳細(xì)講解兩個decoder實現(xiàn)和使用,感興趣的朋友一起看看吧
    2022-05-05
  • Java實現(xiàn)跳轉(zhuǎn)到指定頁面的方法小結(jié)

    Java實現(xiàn)跳轉(zhuǎn)到指定頁面的方法小結(jié)

    在Java中,實現(xiàn)頁面跳轉(zhuǎn)主要涉及到Web開發(fā),而這通常通過使用Java的Web框架(如Servlet、Spring MVC)來完成,下面講解一下如何在不同的Java Web框架中實現(xiàn)頁面跳轉(zhuǎn),文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2024-05-05
  • itext生成PDF設(shè)置頁眉頁腳的實例詳解

    itext生成PDF設(shè)置頁眉頁腳的實例詳解

    這篇文章主要介紹了itext生成PDF設(shè)置頁眉頁腳的實例詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • Java顯示程序包不存在的三種解決方法總結(jié)

    Java顯示程序包不存在的三種解決方法總結(jié)

    在Java開發(fā)中,有時會遇到“程序包javax.servlet不存在”等錯誤提示,這通常是因為缺少必要的庫或依賴項,這篇文章主要給大家介紹了關(guān)于Java顯示程序包不存在的三種解決方法,需要的朋友可以參考下
    2024-07-07
  • java使用淘寶API讀寫json實現(xiàn)手機(jī)歸屬地查詢功能代碼

    java使用淘寶API讀寫json實現(xiàn)手機(jī)歸屬地查詢功能代碼

    本文介紹java使用淘寶API讀寫json實現(xiàn)手機(jī)歸屬地查詢功能,代碼簡單,大家可以參考使用
    2013-11-11
  • springboot整合quartz定時任務(wù)框架的完整步驟

    springboot整合quartz定時任務(wù)框架的完整步驟

    在做項目時有時候會有定時器任務(wù)的功能,比如某某時間應(yīng)該做什么,多少秒應(yīng)該怎么樣之類的,下面這篇文章主要給大家介紹了關(guān)于springboot整合quartz定時任務(wù)框架的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • 解決idea2024版本創(chuàng)建項目時沒有java?8的版本選擇

    解決idea2024版本創(chuàng)建項目時沒有java?8的版本選擇

    這篇文章主要介紹了在使用IntelliJ?IDEA創(chuàng)建Spring?Boot項目時遇到的問題,包括Java版本選擇受限和項目結(jié)構(gòu)不完整,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • 跨域解決方案Jsonp原理解析

    跨域解決方案Jsonp原理解析

    這篇文章主要介紹了跨域解決方案Jsonp原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • java 串口通信實現(xiàn)流程示例

    java 串口通信實現(xiàn)流程示例

    這篇文章主要介紹了java 串口通信實現(xiàn)流程示例,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • 解決@JsonIgnore的使用以及自己踩坑

    解決@JsonIgnore的使用以及自己踩坑

    這篇文章主要介紹了解決@JsonIgnore的使用以及自己踩坑,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評論

昂仁县| 林甸县| 麦盖提县| 莆田市| 南投县| 霍邱县| 正阳县| 蒲城县| 尖扎县| 刚察县| 曲阳县| 云南省| 辰溪县| 闽侯县| 菏泽市| 宣汉县| 丹凤县| 洪雅县| 东丰县| 城固县| 耒阳市| 林周县| 南昌市| 西乌珠穆沁旗| 公主岭市| 潞西市| 泰兴市| 思南县| 观塘区| 和龙市| 吴江市| 万荣县| 微博| 于都县| 鹤庆县| 长春市| 历史| 阜新| 昆明市| 浦江县| 岚皋县|