马踏棋盘问题的介绍
马踏棋盘算法也叫骑士周游问题,其要求是:将马随机放在国际象棋的 8×8 棋盘 Board[0~7][0~7]的某个方格中,马按走棋规则(马走日字)进行移动。要求每个方格只进入一次,走遍棋盘上全部 64 个方格。
算法分析
思路
1) 马踏棋盘问题(骑士周游问题)实际上是图的深度优先搜索(DFS)的应用。
2) 如果使用回溯(就是深度优先搜索)来解决,假如马儿踏了 53 个点,如图:走到了第 53 个,坐标(1,0),发现已经走到尽头,没办法,那就只能回退了,查看其他的路径,就在棋盘上不停的回溯……
图解
上述算法的思路图解如下:
代码实现
代码如下:
package com.study.horse;
import java.awt.*;
import java.util.ArrayList;
/**
* @author 漂亮小小
* @version 1.0
*/
public class HorseChessBoard {
private static int X;//列数
private static int Y;//行数
//创建一个数组,标记棋盘的各个位置是否被访问过
private static boolean[] visited;
//使用一个属性,标记棋盘的所有位置是否都被访问过了,即:是否成功 true代表成功
private static boolean finished = false;
public static void main(String[] args) {
//c测试
X = 8;
Y = 8;
int row = 1;//马儿的初始位置的行 从1开始编号
int colum = 1;//马儿的初始位置的列 从1开始编号
//创建棋盘
int[][] chessboard = new int[X][Y];
visited = new boolean[X * Y];
//测试耗时
long start = System.currentTimeMillis();//开始时间
//调用方法
traversalChessBoard(chessboard, row - 1, colum - 1, 1);
long end = System.currentTimeMillis();
System.out.println("程序用时:" + (end - start) + "毫秒");
//输出棋盘的遍历情况
for (int[] rows : chessboard) {
for (int step : rows) {
System.out.print(step + "\t");
}
System.out.println();
}
}
//方法:马踏棋盘核心算法
/**
* 骑士周游问题的算法
*
* @param chessboard 棋盘
* @param row 马儿当前位置的第几行 从0 开始
* @param column 马儿当前位置的第几列 从0开始
* @param step 是第几步 初始位置就是第一步 以后每次+1
*/
public static void traversalChessBoard(int[][] chessboard, int row, int c