码迷,mamicode.com
首页 > 编程语言 > 详细

java实现马踏棋盘问题

时间:2018-02-21 16:37:03      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:描述   post   完整   java   imp   util   通过   printf   print   

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实现马踏棋盘问题

标签:描述   post   完整   java   imp   util   通过   printf   print   

原文地址:https://www.cnblogs.com/zzlback/p/8456722.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!