基于Java实现马踏棋盘游戏算法

马踏棋盘很好实现,但有时运行起来特别慢,还可能出不来结果,最常用的就是深度优先遍历+回溯,相信大家都学过数据结构,对图的深度遍历都有了解,下面就是代码的实现,如果对代码理解有困难,可以先熟悉一下图的深度优先遍历

大家可以把棋盘改小一些测试,8x8的确实很慢

import java.util.Arrays;

/**
 * 骑士周游问题
 * @author LM_Code
 * @create 2019-03-17-18:57
 */
public class KnightProblem {
    static final int SIZE = 8;//设置棋盘的行数和列数>=5时才有解
    static final int[][] A = new int[SIZE][SIZE];//初始化棋盘,数组中所有值默认为0
    static final int[] NEXT= new int[]{1, 2};//设置马的下一步,用空间为2的数组代替x,y坐标
    public static void main(String[] args) {
        //判断此点是否能走完整个棋盘
        if(method(NEXT, 1)){//能,则输出棋盘轨迹
            for (int i = 0; i < A.length; i++) {
                System.out.println(Arrays.toString(A[i]));
            }
        }else{//不能,提示无解
            System.out.println("此起点无解");
        }
    }
    //传入下一步NEXT,和并表明下一步是第几步tag,返回此点是否能走完棋盘(有解)
    public static boolean method(int[] NEXT, int tag){
        int[] current = new int[]{NEXT[0], NEXT[1]};//将当前步存入本次方法调用的局部变量
        A[current[0]][current[1]] = tag;//把马跳到当前位置,并标记为是第几步
        // 如果是最后一步,递归结束
        if(tag == SIZE*SIZE){
            return true;
        }
        //如果不是最后一步,下一步有8中可能
        for (int i = 0; i < 8; i++) {
            //下一步的第i种情况是否可走
            if(canGo(current, i)){//如果可以走,继续递归
                //判断此时的下一步,是否能走完棋盘
                if(method(NEXT, tag+1)){//能,返回true,递归结束
                    return true;
                }
                //此时的下一步不能走完棋盘,则继续寻找第i+1种情况的下一步是否有解
            }
            //此时的下一步无解,则寻找第i+1种情况是否有解
        }
        //如果当前步无法走完棋盘(无解)
        A[current[0]][current[1]] = 0;//回溯:撤销当前步,当前步赋值为0
        return false;//返回false,回到上一步,表明此步无解
    }
    //判断下一步是否能走,下一步有8中情况0-7,传入当前步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;
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java实现两人五子棋游戏(二) 画出棋盘

    本文为大家分享了java画出五子棋游戏棋盘的方法,供大家参考,具体内容如下 棋盘模块: 画五子棋棋盘:19条横线.19条竖线 步骤一:显示棋盘 我有一张名为chessboard.png的棋盘,位置为根目录/res/drawable/chessboard/png,现在我要显示这张图片. DrawChessBoard.java package xchen.test.simpleGobang; import java.awt.Graphics; import java.awt.Image; impor

  • java实现马踏棋盘的完整版

    本文实例为大家分享了java实现马踏棋盘的具体代码,供大家参考,具体内容如下 马踏棋盘很好实现,但有时运行起来特别慢,还可能出不来结果,在这里要用到贪心算法来优化,即找出最难走的路径,也就是下下步可下棋的位置最少. 下面给出该算法完整代码: /*      * 马踏棋盘问题:(贪婪法求解)      * 棋盘有64个位置,"日"字走法,刚好走满整个棋盘      */     //下一个走法的方向类     class Direction{         int x;        

  • java实现马踏棋盘游戏

    用java实现马踏棋盘游戏算法,供大家参考,具体内容如下 在4399小游戏中有这样一个游戏 这是代码实现 package com.HorseChess; import java.awt.*; import java.util.ArrayList; import java.util.Comparator; import java.util.Scanner; public class HorseChess {     private static int X;     private static

  • java绘制国际象棋与中国象棋棋盘

    JAVA API 中的绘制图形类的paint()方法,我们可以轻松绘制中国象棋与国际象棋的棋盘.详见代码:  一.中国象棋棋盘代码 import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class ChineseChese extends Frame{

  • java学习笔记之马踏棋盘算法

    马踏棋盘或骑士周游问题 1.马踏棋盘算法也被称为骑士周游问题2.将马随机放在国际象棋的 8×8 棋盘 Board[0-7][0-7]的某个方格中,马按走棋规则(马走日字)进行移动.要求每个方格只进入一次,走遍棋盘上全部 64 个方格 思路 会使用到深度优先思想和类似迷宫问题的寻路策略问题,和八皇后问题也有相似. 1.用一个二维数组建立整张棋盘.用另外一个二维数组保存棋盘的每一个位置是否走过2.马在棋盘上有一个初始位置,将这个位置设为已走过,并将步数设为1.3.获得在这个位置上,马下一步能走的位置

  • Java实现马踏棋盘算法

    本文实例为大家分享了Java实现马踏棋盘的具体代码,供大家参考,具体内容如下 马在某个点最多可能有8种走法,用递归和回溯实现. 注:代码中,查找下一个可走坐标是从右下第一个开始的,也就是图中的4.可以通过修改a,b...h的值来改变顺序. 代码: /**  * 马踏棋盘算法   * 递归和回溯  *  */ public class HorseStep {          public static int X = 8;     public static int Y = 8;        

  • java数据结构和算法之马踏棋盘算法

    本文实例为大家分享了java实现算法之马踏棋盘的具体代码,供大家参考,具体内容如下 一.马踏棋盘算法介绍 马踏棋盘算法也被称为骑士周游问题将马随机放在国际象棋的8×8棋盘Board[0-7][0-7]的某个方格中,马按走棋规则(马走日字)进行移动.要求每个方格只进入一次,走遍棋盘上全部64个方格 二.骑士周游问题的思路分析 1.创建棋盘 chessBoard , 是一个二维数组2.将当前位置设置为已经访问,然后根据当前位置,计算马儿还能走哪些位置,并放入到一个集合中(ArrayList), 最多

  • Java基于分治算法实现的棋盘覆盖问题示例

    本文实例讲述了Java基于分治算法实现的棋盘覆盖问题.分享给大家供大家参考,具体如下: 在一个2^k * 2^k个方格组成的棋盘中,有一个方格与其它的不同,若使用以下四种L型骨牌覆盖除这个特殊方格的其它方格,如何覆盖.四个L型骨牌如下图: 棋盘中的特殊方格如图: 实现的基本原理是将2^k * 2^k的棋盘分成四块2^(k - 1) * 2^(k - 1)的子棋盘,特殊方格一定在其中的一个子棋盘中,如果特殊方格在某一个子棋盘中,继续递归处理这个子棋盘,直到这个子棋盘中只有一个方格为止如果特殊方格不

  • java编程实现国际象棋棋盘

    本文实例为大家分享了java编程实现国际象棋棋盘的具体代码,供大家参考,具体内容如下 问题描述: 打印出国际象棋棋盘(黑白交错) 问题分析: 棋盘由八块黑白相间的方块组成,通过swing编程实现.其中用标签来实现方块,在方块中填充黑或白色.通过i,j来遍历行和列,以i和j的值来判断填充什么颜色 代码分析 import javax.swing.*; import java.awt.*; public class _2ChessBoard { public static void main(Stri

  • java实现马踏棋盘的算法

    本文实例为大家分享了java实现马踏棋盘的具体代码,供大家参考,具体内容如下 马踏棋盘算法介绍 8X8棋盘,马走日字,要求每个方格只进入一次,走遍棋盘上全部64个方格. 代码: public class HorseChessBoard {     private static int X;//棋盘的列数     private static int Y;//棋盘的行数     //创建一个数组,标记棋盘的各个位置是否被访问过     private static boolean visited[

随机推荐