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 --; //回溯
}
}