java实现马踏棋盘的完整版

 更新时间:2022年02月14日 15:48:21   作者:布鲁克泰勒  
这篇文章主要为大家详细介绍了java实现马踏棋盘的完整版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了java实现马踏棋盘的具体代码,供大家参考,具体内容如下

马踏棋盘很好实现,但有时运行起来特别慢,还可能出不来结果,在这里要用到贪心算法来优化,即找出最难走的路径,也就是下下步可下棋的位置最少。

下面给出该算法完整代码:

/*
     * 马踏棋盘问题:(贪婪法求解)
     * 棋盘有64个位置,“日”字走法,刚好走满整个棋盘
     */

    //下一个走法的方向类
    class Direction{
        int x;
        int y;
        int wayOutNum;
    }

    public class Hores_chessboard_1 {
        static final int[] dx = { -2, -1, 1, 2, 2, 1, -1, -2 }; // x方向的增量  
        static final int[] dy = { 1, 2, 2, 1, -1, -2, -2, -1 }; // y方向的增量  
        static final int N = 8;     
        static int[][] chessboard = new int[N][N]; // 棋盘 

    /**
     * 
     * @param nami
     * @param x,y为棋子的位置
     * @return 如果棋子的位置不合法,则返回一个大于8的数。
     * 否则返回棋子的下个出路的个数
     */
    static int wayOut(int x, int y){        
        int count = 0;
        int tx, ty, i;
        //判断是否超出棋盘边界,该位置是否已经下过
        if(x<0 || x>7 || y<0 || y>7 || chessboard[x][y]!=0){
            return 9;
        }
        for(i=0; i<N; i++){
            tx = x+dx[i];
            ty = y+dy[i];
            //如果棋子的下个出路可行,则出路数自加一次
            if(tx>-1 && tx<8 && ty>-1 && ty<8 && chessboard[tx][ty]==0)
                count++;
        }
        return count;
    }

    /**
     * 按照棋子的下个出路的个数从低到高排序
     * @param next 棋子的八个位置的数组
     */
    static void sort(Direction[] next){
        int i, j, index;
        Direction temp = null;
        //这里用的选择排序
        for(i=0; i<N; i++){
            index = i;
            for(j=i+1; j<N; j++){
                if(next[index].wayOutNum > next[j].wayOutNum)
                    index = j;
            }
            if(i != index){
                temp = next[i];
                next[i] = next[index];
                next[index] = temp;
            }
        }
    }

    static void Move(int x, int y, int step){
        int i, j;
        int tx, ty;
        //如果step==64,则说明每个棋格都走到了,现在只需要打印结果就完了
        if(step == N*N){
            for(i=0; i<N; i++){
                for(j=0; j<N; j++){
                    System.out.printf("%3d", chessboard[i][j]);
                }
                System.out.println();
            }
            System.exit(0);
        }

        //下一个棋子的N个位置的数组
        Direction[] next = new Direction[N];

        for(i=0; i<N; i++){
            Direction temp = new Direction();
            temp.x = x+dx[i];
            temp.y = y+dy[i];
            next[i] = temp;
            //循环得到下个棋子N处位置的下个出路的个数
            next[i].wayOutNum = wayOut(temp.x, temp.y);
        }

        //配合贪婪算法,按下个棋子的下个出路数排序后,next[0]就是下个出路数最少的那个
        sort(next);

        for(i=0; i<N; i++){
            tx = next[i].x;
            ty = next[i].y;
            chessboard[tx][ty] = step;
            Move(tx, ty, step+1);
            /*如果上面Move()往下一步走不通,则回溯到这里
            重置chessboard[tx][ty]为0,接着i++,又循环...... */
            chessboard[tx][ty] = 0;
        }
    }

    public static void main(String[] args) {
        int i, j;
        //初始化棋盘
        for(i=0; i<8; i++){
            for(j=0; j<8; j++){
                chessboard[i][j] = 0;
            }
        }
        System.out.println("请输入棋子开始位置(0-7):");
        Scanner sc = new Scanner(System.in);
        int x = sc.nextInt();
        int y = sc.nextInt();
        //第一步不用比较,赋值第一步
        chessboard[x][y] = 1;
        Move(x, y, 2);      
    }
}

这里给出运算结果:

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

相关文章

  • java实现猜数字小游戏(Swing版)

    java实现猜数字小游戏(Swing版)

    这篇文章主要介绍了java实现猜数字小游戏,Swing编程版的猜数字游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • SpringBoot整合jasypt实现敏感信息的加密详解

    SpringBoot整合jasypt实现敏感信息的加密详解

    一般公司的核心业务代码中,都会存在与数据库、第三方通信的secret key等敏感信息,如果以明文的方式存储,一旦泄露,那将会给公司带来巨大的损失。本篇文章通过讲解:Springboot集成Jasypt对项目敏感信息进行加密,提高系统的安全性
    2022-09-09
  • gRPC在Java中的实现与应用详解

    gRPC在Java中的实现与应用详解

    gRPC是由Google开发的高性能、开源的通用远程过程调用(RPC)框架,本文将详细介绍如何在Java中使用gRPC,包括服务定义、服务器端实现、客户端调用以及一些高级特性,我们将通过代码示例来帮助理解gRPC的工作原理,需要的朋友可以参考下
    2024-06-06
  • 如何将SpringBoot项目打成 war 包并部署到Tomcat

    如何将SpringBoot项目打成 war 包并部署到Tomcat

    这篇文章主要介绍了如何将SpringBoot项目 打成 war 包 并 部署到 Tomcat,当前环境是windows,tomcat版本是8.5采用的springboot版本是2.2.3,本文结合实例代码给大家详细讲解需要的朋友可以参考下
    2022-11-11
  • IDEA生成项目后出现的iml和idea文件问题

    IDEA生成项目后出现的iml和idea文件问题

    这篇文章主要介绍了IDEA生成项目后出现的iml和idea文件问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • springboot使用war包部署到外部tomcat过程解析

    springboot使用war包部署到外部tomcat过程解析

    这篇文章主要介绍了springboot使用war包部署到外部tomcat过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Java实现九九乘法表的小例子

    Java实现九九乘法表的小例子

    九九乘法表一般为三角形,每个数分别和从1到自身的数相乘然后把结果列出来,即要用到两层循环,外层是从1到9for(i=1;i<=9;i++),内层是当前数和从1到自身相乘for(j=1;j<=i;j++)
    2013-09-09
  • SpringBoot整合Vue实现微信扫码支付以及微信退款功能详解

    SpringBoot整合Vue实现微信扫码支付以及微信退款功能详解

    最近公司要在微信公众号上做一个活动预报名,活动的门票等需要在微信中支付,下面这篇文章主要给大家介绍了关于SpringBoot整合Vue实现微信扫码支付以及微信退款功能的相关资料,需要的朋友可以参考下
    2022-05-05
  • Java和C#输入输出流的方法(详解)

    Java和C#输入输出流的方法(详解)

    下面小编就为大家带来一篇Java和C#输入输出流的方法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • Mybatis实现分页查询的详细流程

    Mybatis实现分页查询的详细流程

    这篇文章主要给大家介绍了关于Mybatis实现分页查询的详细流程,MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架,需要的朋友可以参考下
    2023-08-08

最新评论