java实现马踏棋盘问题

Posted zzl的日常work

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java实现马踏棋盘问题相关的知识,希望对你有一定的参考价值。

1.问题描述:

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

 

2.输入样式:

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

    1  1

3.输出样式:

    1   20   11   14    3    6    9   16
   12   23    2   19   10   15    4    7
   21   30   13   24    5    8   17   26
   32   35   22   29   18   25   54   45
   39   48   31   34   55   46   27   60
   36   33   38   47   28   59   44   53
   49   40   63   56   51   42   61   58
   64   37   50   41   62   57   52   43

 

   1   20   11   14    3    6    9   16
   12   23    2   19   10   15    4    7
   21   30   13   24    5    8   17   26
   32   35   22   29   18   25   57   45
   39   63   31   34   56   46   27   51
   36   33   38   47   28   52   44   58
   62   40   64   55   60   42   50   53
   64   37   61   41   49   54   59   43

.......

4.解题思路:

    我们用一个二维数组模拟马走的方向,通过函数move(x,y),来达到马走。 如果棋盘x<0 || x>7 || y<0 || y>7表示,x,y不在棋盘内,则直接return。如果棋盘qipan[x][y] ! = 0表示已经走过了,也直接

  return. 另外一个变量step,记录棋盘的步数,从1一直到64,如果step到了64,则直接输出棋盘,并且count++;没到64则递归调用move(x,y)函数.  最后走完一种方案再回溯.

 

5.代码实例:

import java.util.Scanner;

public class Chess{

  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[8][8];

  static int count = 0;//  全部走完棋盘的方案

  public static void main(String[] args){

 

    //先初始化棋盘
    for(int i=0;i<8;i++){

      for(int j=0;j<8;j++){

        qipan[i][j] = 0;

      }

    }

    System.out.println("请输入棋盘马的起始位置:");

    Scanner scn = new Scanner(System.in);

    int x = scn.nextInt();

    int y = scn.nextInt();

    x--;  //棋盘输入是从1,1开始,而数组的起始位置是从0,0开始

    y--;

    move(x,y);

  }

  public static void move(int x,int y){

    int next_x;

    int next_y;

    //x,y越界了

    if(x<0 || x>7 || y<0 || y>7){

      return;

    }

    //表示棋盘上已经有马走过了

    if(qipan[x][y] != 0){

      return;

    }

    qipan[x][y] = step;

    step++;

    //如果step大于64了,则直接输出并计数
    if(step>64){

      for(int i=0;i<8;i++){

        for(int j=0;j<8;j++){

          System.out.printf("%5d",qipan[i][j]);

        }

        System.out.println();

      }

      System.out.println("===============");

      count++;

      return;

    }else{

      for(int i=0;i<8;i++){ //马可以走的8个方向

        next_x = x + weizhi[i][0];

        next_y = y + weizhi[i][1];

        move(next_x,next_y);

      }

    }

    qipan[x][y] = 0;

    step --; //回溯

  }

}

 

















以上是关于java实现马踏棋盘问题的主要内容,如果未能解决你的问题,请参考以下文章

第28章 算法优化体验课 - 骑士周游问题

马踏棋盘(骑士周游问题)

程序员常用 10 种算法之马踏棋盘算法

马踏棋盘:一个贪心算法实例

马踏棋盘算法详解

骑士游历问题(马踏棋盘)解析(c++)