1. 程式人生 > >java實現馬踏棋盤問題

java實現馬踏棋盤問題

並且 mov .... i++ pan 這一 初始化 count 調用

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實現馬踏棋盤問題