码迷,mamicode.com
首页 > 其他好文 > 详细

骑士周游问题

时间:2017-09-04 00:02:54      阅读:404      评论:0      收藏:0      [点我收藏+]

标签:问题   amp   return   highlight   void   java   代码   ret   下一步   

问题:在一个 8*8 的棋盘上,马按照“日”字走,给定一个起点,打印出马不重复的走完棋盘64个格子的路径。

  解答:递归 + 回溯 (对于任一步,马能走的下一步有8个方向,但是需要满足两个条件:1. 格子在棋盘内, 2. 格子没有被访问过),回溯的原因是,每次选择一个方向,有可能会走到死胡同。这时候就需要回溯,重新选择方向。

代码:

public static int[][] jump = {{2,1}, {1,2}, {-1,2}, {-2,1}, {-2,-1}, {-1,-2}, {1,-2}, {2,-1}};   // 每次的8个方向,保存在数组中
public static int[][] path = new int[64][2];    // 记录路径

public static boolean check (int x, int y, int[][] visited) {
	if (x >= 0 && x <= 7 && y >= 0 && y <= 7 && visited[x][y] == 0) {
		return true;
	}
	return false;
}

public static int horse (int x, int y, int[][] visited,  int cnt) {
	if(cnt==64) return cnt;
	for(int i = 0; i < 8; i++) {
		if (check(x+jump[i][0], y+jump[i][1], visited)) {
			x = x+jump[i][0];
			y = y+jump[i][1];
			visited[x][y] = 1;
			path[cnt][0] = x;
			path[cnt][1] = y;
			if (horse(x, y, visited, ++cnt) != 0) {
				return 1;        // 能继续走下去
			}
               // 否则,执行如下代码,即回溯(把状态恢复到递归之前,进行下一步的方向选择) cnt--; visited[x][y] = 0; x = x-jump[i][0]; y = y-jump[i][1]; } } return 0; } public static void main(String[] args) { int[][] visited = new int[8][8]; visited[0][0] = 1; System.out.println(horse(0, 0, visited, 1)); for (int[] i : path) { System.out.print(" " + i[0] + i[1]); } }

  

  

骑士周游问题

标签:问题   amp   return   highlight   void   java   代码   ret   下一步   

原文地址:http://www.cnblogs.com/satchel/p/7471299.html

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