骑士周游问题

问题:在一个 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]);
	}
}

  

  

时间: 2024-12-19 14:10:18

骑士周游问题的相关文章

骑士周游问题 --- 递归解法 --- java代码

骑士游历: 定义了向量的数组M,行数组X,列数组Y, 棋盘plane,计数器count,走动步数step 需要注意的是,递归函数的进入前的验证,原先的想法是传入来时的方向参数,可是这样的想法被实践否定了, 从理论上看,一个棋子走向哪里是不受它的过去制约的,最近的过去也不例外, 详情请见:http://en.wikipedia.org/wiki/Knights_tour 代码如下: /** * Created by kodoyang on 2014/5/3. */ public class Kni

马踏棋盘(骑士周游问题)

马踏棋盘问题(骑士周游问题) 实际上是图的深度优先搜索(DFS)的应用. 如果使用回溯(就是深度优先搜索)来解决,假如马儿踏了53个点,如图:走到了第53个,坐标(1,0),发现已经走到尽头,没办法,那就只能回退了,查看其他的路径,就在棋盘上不停的回溯-- ,思路分析+代码实现 使用贪心算法(greedyalgorithm)进行优化.解决马踏棋盘问题. /** * 〈马踏棋盘 算法〉 * * @author LZ * @create 2019/9/29 * @since 1.0.0 */ pub

小甲鱼数据结构和算法--马踏棋盘(骑士周游问题)

代码如下: #include<stdio.h> #include<time.h> #define X 5 #define Y 5 int chess[X][Y]; void printChess(){ int i,j; printf("This is horse Chess:\n"); for( i=0;i<X;i++){ for(j=0;j<Y;j++){ printf("%2d\t",chess[i][j]); } print

骑士周游

#include <iostream> #include <iomanip> using namespace std; #define N 6 int a[N][N] = { 0 }; bool judge(int a[][N], int b, int c, int dir) { if (dir == 0) { if (b - 2 >= 0 && c - 1 >= 0 && a[b - 2][c - 1] == 0) { return t

Python----DFS---骑士周游问题

这篇文章将会将一个数据结构与算法中一个很经典很重要的概念--深度优先搜索(Depth-First-Search:DFS).........(你他喵不是在标题里说了吗?) 好吧,DFS的精髓我其实也还没有弄的特别懂,估计得多用用才能理解更深吧. !!!敲黑板!!!DFS的关键是递归,递归是真好用!!! 深度优先搜索(DFS) 什么是DFS呢,秉着能动手就绝不吵吵的原则,直接给出网上大神的博文链接:http://www.cnblogs.com/skywang12345/p/3711483.html

算法之美_源代码发布(5)

本文辑录了<算法之美--隐匿在数据结构背后的语言>(电子工业出版社2016年出版)一书第5~6章之代码(P149~P183).全文目录."45个算法"目录."22个经典问题目录",以及有奖捉虫活动详情请见如下链接:http://blog.csdn.net/baimafujinji/article/details/50484348 附录中的经典笔试.面试问题参考答案请见: http://blog.csdn.net/baimafujinji/article/

POJ2488A Knight&#39;s Journey(dfs+数学)

A Knight's Journey Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 32422   Accepted: 11040 Description Background The knight is getting bored of seeing the same black and white squares again and again and has decided to make a journey ar

数学王子--Gauss

当Godel听说了Gauss能证明一切命题,他让Gauss证明“存在Gauss不能证明的命题”Gauss证出来了,但还是不存在他不能证明的命题.量子态就是这样产生的. 上帝不掷骰子,除非Gauss答应让他赢一次.Gauss不能理解随机过程,因为他能预测随机数. Gauss用奥卡姆剃刀剃胡子. 只有 Gauss 才知道 Schrödinger 的猫是死是活. 没有诺贝尔数学奖,因为第一年Gauss就把所有奖金拿走了. Gauss 把无穷当作归纳证明中的第一个非平凡的情况. Gauss 不用任何公理

算法之美_源代码发布(11)——完结篇

本文辑录了<算法之美--隐匿在数据结构背后的语言(C++版)>(电子工业出版社2016年出版)一书第11章之代码(P375~P406).全文目录."45个算法"目录."22个经典问题目录",以及有奖捉虫活动详情请见如下链接:http://blog.csdn.net/baimafujinji/article/details/50484348 附录中的经典笔试.面试问题参考答案请见: http://blog.csdn.net/baimafujinji/art