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. setinIerval和setTimeout的区别?

    setTimeout和setInterval的使用 这两个方法都可以用来实现在一个固定时间段之后去执行JavaScript.不过两者各有各的应用场景. 方 法 实际上,setTimeout和setIn ...

  2. c# Nlog 非xml cs方法配置

    public static void InitLog(TargetWithLayout target = null, string level = "Debug", string ...

  3. [SCOI2007]最大土地面积

    首先,最大四边形的四个点一定在凸包上 所以先求凸包 有个结论,若是随机数据,凸包包括的点大约是\(\log_2n\)个 然鹅,此题绝对不会这么轻松,若\(O(n^4)\)枚举,只有50分 所以还是要想 ...

  4. mysql之mysql_config_editor

    本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn mysql_config_editor允许你把登录的身份验证信息存储 ...

  5. IntelliJ IDEA(八) :git的使用

    项目管理离不开版本控制,目前主流版本控制工具大概就是SVN和Git,至于两者有啥区别这里就不详细介绍了,如果有不明白的可以上网查资料,后期如果有机会我再开篇栏目细说,而且现在市场上Git的使用率已经远 ...

  6. 测试任务汇总v1.0

    2017.08.04 整理了目前我们所在团队需要做的日常任务 定义为v1.0

  7. Node.js的下载、安装、配置、Hello World、文档阅读

    Node.js的下载.安装.配置.Hello World.文档阅读

  8. java复习笔记

    本笔记(无异常处理与网络编程部分)整理自<java程序设计>-黄岚 王岩 王康平 编著 java数据     UI     I/O      java线程      数据库操作 Java数 ...

  9. filter-api文档

    git地址:https://github.com/jiqianqin/filters 不断优化中,欢迎加入讨论- filter-tags 效果图: 参数 说明 格式 备注 data 展示的数据 [{ ...

  10. C++ 中vector的使用方法(转)

    原地址:http://blog.csdn.net/duan19920101/article/details/50617190/ 在c++中,vector是一个十分有用的容器. 作用:它能够像容器一样存 ...