1.问题描述:

  在国际象棋中,马走日,用户输入棋盘的起始位置从x:0-4,y:0-3输出从这一点开始,马走完整个棋盘的各个方案,并输出方案数

2.输入样式:

  请输入棋盘马起始位置:
  0 0

3.输出样式:

1    4   17   12
   18   13    2    5
    3    8   11   16
   14   19    6    9
    7   10   15   20
==========================
    1    4   15   20
   14   19    2    5
    3    8   11   16
   18   13    6    9
    7   10   17   12
==========================

.......

4.解题思路:

    我们用一个二维数组模拟马走的方向,通过函数move(x,y),来达到马走。 如果棋盘next_x>=0 && next_x<=4 && next_y>=0 && next_y<=3表示next_x,next_y在棋盘内,棋盘qipan[next_x][next_y] = = 0表示起盘没有走过,即下一步满足这些条件,则把下一步置为走过的状态,step++,调用move(next_x,next_y)函数,调用完再回溯。

5.代码实例:

package com.zzl;

import java.util.Scanner;

/**
 *             1.问题描述 在国际象棋中,马只能走日,但是马位于不同的方位可以走的方向有所区别
 *                 当马位于棋盘中间位置的时候
 *
 *
 */
public class 马踏棋盘问题求解 {
        //马能走的8个方向
    static int weizhi[][] = {{-2,1},{-2,-1},{-1,2},{-1,-2},{1,2},{1,-2},{2,1},{2,-1}};

    static int step = 1;//先走哪一步,步数
    static int qipan[][] = new int[5][4];
    static int count = 0;
    public static void main(String[] args) {
        //初始化棋盘
        for(int i=0;i<qipan.length;i++){
            for(int j=0;j<qipan[i].length;j++){
                qipan[i][j] = 0;
            }
        }
        //输入起始位置,起始位置从1,1开始算 ,计算机数组从0,0开始算,所以x--,y--;
        Scanner scn = new Scanner(System.in);
        System.out.println("请输入棋盘马起始位置:");
        int x = scn.nextInt();
        int y = scn.nextInt();
    
        qipan[x][y] = step;
        step++;
        move(x,y);
        System.out.println("共有" + count + "种方案");
    }
    public static void move(int x, int y) {
        int next_x = 0;
        int next_y = 0;
        if(step>20){
            for(int i=0;i<5;i++){
                for(int j=0;j<4;j++){
                    System.out.printf("%5d",qipan[i][j]);
                }
                System.out.println();
            }
            System.out.println("==========================");
            count ++;
            return;
        }else{
            for(int i=0;i<8;i++){
                next_x = x + weizhi[i][0];
                next_y = y + weizhi[i][1];

    //下一步棋满足条件
                if(next_x>=0 && next_x<=4 && next_y>=0 && next_y<=3 && qipan[next_x][next_y] ==0){
                    qipan[next_x][next_y] = step;
                    step++;
                    move(next_x,next_y);
                    step--;
                    qipan[next_x][next_y] = 0;
                }
            }
        }
    }
}

java实现马踏棋盘问题的更多相关文章

  1. 剑指Offer_12_矩阵中的路径(参考问题:马踏棋盘)

    题目描述  请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵 ...

  2. 马踏棋盘问题-贪心(MATLAB&C++)

    原创文章,转载请注明:马踏棋盘问题-贪心(MATLAB&C++) By Lucio.Yang 1.问题描述 将马随机放在国际象棋的Board[0-7][0-7]的某个方格中,马按走棋规则进行移 ...

  3. C++代码审查---审查孙晓宁马踏棋盘谜题程序

    与孙晓宁同学结对审查,其代码地址如下:https://github.com/brunnhilder/-1/blob/master/%E9%A9%AC%E8%B8%8F%E6%A3%8B%E7%9B%9 ...

  4. python 回溯法 子集树模板 系列 —— 18、马踏棋盘

    问题 将马放到国际象棋的8*8棋盘board上的某个方格中,马按走棋规则进行移动,走遍棋盘上的64个方格,要求每个方格进入且只进入一次,找出一种可行的方案. 分析 说明:这个图是5*5的棋盘. 图片来 ...

  5. 马踏棋盘--dfs

    [问题描述]关于马踏棋盘的基本过程:国际象棋的棋盘为 8*8 的方格棋盘.现将"马"放在任意指定的方格中,按照"马"走棋的规则将"马"进行移 ...

  6. 马踏棋盘算法递归+回溯法实现 C语言

    r为矩阵的行,c为矩阵的列 将结果输出到当前目录下的results.txt. 结果将给出:1.是否存在路径使马可以按要求走遍所有的方格: 2.解的总数: 3.程序执行的时间: #include< ...

  7. day53-马踏棋盘

    马踏棋盘 1.算法优化的意义 算法是程序的灵魂,为什么有些程序可以在海量数据计算时,依旧保持高速计算? 编程中算法很多,比如八大排序算法(冒泡.选择.插入.快排.归并.希尔.基数.堆排序).查找算法. ...

  8. Java匹马行天下——开篇

    个人感言: 匹马行天下是我高中时候看过一部叫<九鼎记>的小说中的其中一个大章节标题,在整个这一章中,讲的是是主人公滕青山历经艰险,又心如磐石,一心修行,最后巅峰归来的故事.现在回想,依旧心 ...

  9. Java匹马行天下之JavaWeb核心技术——JSP

    JSP动态网页技术 一.JavaWeb简介 一.什么是JavaWeb? JavaWeb是用Java技术来解决相关web互联网领域的技术总称. 需要在特定的web服务器上运行,分为web服务器和web客 ...

随机推荐

  1. HDU 1724 Ellipse [辛普森积分]

    Ellipse Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  2. 利用GUID唯一标识符并设置它的过期时间

    项目中遇到一个小问题,就是把服务器创建的GUID发送给客户端,客户端接收后,下次访问时带上这个GUID, 服务端这边就进行验证,并做相应的处理. 问题是:项目中还需要这个GUID带过期时间,那是如何设 ...

  3. 为Android添加JNI支持

    起因 今天在进行Android原生开发时,需要通过JNI调用C++代码实现一些处理.以前没有做过类似的东西,在网上找了很久才解决问题,特记录下来以便以后翻阅. Eclipse无cygwin编译so的方 ...

  4. Excel地图插件(ExcelMaps)

    1 软件概述 一款基于Excel表格进行地理数据挖掘.坐标转换.地图绘制.地图图表等操作的工具类应用软件.具有易用.高效.稳定的特点,能够满足地理数据应用及处理的基本需求,也可提供个性化定制开发服务. ...

  5. WPF项目学习.三

    工具代码记录 版权声明:本文为博主初学经验,未经博主允许不得转载. 一.前言 记录在学习与制作WPF过程中遇到的解决方案. 分页控件的制作,邮件发送,日志代码,excel导入导出等代码的实现过程: 二 ...

  6. Linux-安装FFmpeg

    FFmpeg官网:http://www.ffmpeg.org 官网介绍 FFmpeg is the leading multimedia framework, able to decode, enco ...

  7. [转]【C#】分享一个弹出浮动层,像右键菜单那样召即来挥则去

    适用于:.net2.0+ Winform项目 背景: 有时候我们需要开一个简单的窗口来做一些事,例如输入一些东西.点选一个item之类的,可能像这样: 完了返回原窗体并获取刚刚的输入,这样做并没有什么 ...

  8. JQuery坑,说说哪些大家都踩过的坑

    1 乱用选择器 坑人指数:200 JQuery选择器调用代价很大,反复调用效率更低.应采用缓存对象的方法或采用链式调用的方式. //错误的写法 $("#button").click ...

  9. Ubantu16.04 redis安装

    通过FTP方式将redis的安装包从windows上传到linux上 解压命令:$sudo tar -zxf ~/Downloads/redis-3.2.7.tar.gz -C /usr/local ...

  10. iOS 添加WKWebView导致控制器无法释放的问题

    在WkWebView与JavaScript交互中,经常会在原生中注入MessageHandler,app中注入MessageHandler的方法 WKWebViewConfiguration *con ...