.
import java.util.Scanner;
public class KnightSeemsRight {
public static final int MAX_EXITS = 8;
public static final int SIDE_LENGTH = 8;
static int[][] board = new int[SIDE_LENGTH][SIDE_LENGTH];
static int[] nexti = new int[MAX_EXITS];
static int[] nextj = new int[MAX_EXITS];
static int npos;
static int kti, ktj;
static int[] ktmove1 = { -2, -1, 1, 2, 2, 1, -1, -2 };
static int[] ktmove2 = { 1, 2, 2, 1, -1, -2, -2, -1 };
static int[] exits = new int[MAX_EXITS];
public static void main(String args[]) {
Scanner input = new Scanner(System.in);
System.out.printf("骑士巡游问题\n");
boolean flag=false;
while(true)
{
while (true) {
System.out.printf("输入骑士的开始位置:\n");
kti = input.nextInt();
ktj = input.nextInt();
kti--;
ktj--;
// 从0开始,所以只到7而已
if (!((kti >= 0) && (kti < MAX_EXITS)) || // 超出边界出错
!((ktj >= 0) && (ktj < MAX_EXITS))) {
System.out.printf("输入错误\n");
continue;
}
break;
}
knight_tour();
}
}
public static void knight_tour() {
int i, j, k, l, m, min;
int starti, startj;
for (i = 0; i < SIDE_LENGTH; i++)
for (j = 0; j < SIDE_LENGTH; j++)
board[i][j] = 0;
board[kti][ktj] = 1;
starti = kti;
startj = ktj;
for (m = 1; m <= 63; m++) {
npos = 0;
for (k = 0; k < MAX_EXITS; k++) { // 试各个方向
i = kti + ktmove1[k];
j = ktj + ktmove2[k];
if (i >= 0 && i < MAX_EXITS && j >= 0 && j < MAX_EXITS
&& board[i][j]==0) { // 可行
nexti[npos] = i;
nextj[npos] = j;
npos++;
}
}
if (npos == 0) {
System.out.printf("Knight tour failed at m = %d.\n", m);
break;
} else if (npos == 1)
min = 0;
else {
for (l = 0; l < npos; l++)
exits[l] = 0;
min = 0;
for (l = 0; l < npos; l++) {
for (k = 0; k < MAX_EXITS; k++) {
i = nexti[l] + ktmove1[k];
j = nextj[l] + ktmove2[k];
if (i >= 0 && i < MAX_EXITS && j >= 0 && j < MAX_EXITS
&& board[i][j]==0) {
exits[l]++;
}
}
if (exits[l] < exits[min])
min = l;
}
}
kti = nexti[min];
ktj = nextj[min];
board[kti][ktj] = m;
}
//输出
for (i = 0; i < SIDE_LENGTH; i++) {
for (j = 0; j < SIDE_LENGTH; j++)
if (i == starti && j == startj)
System.out.printf("%4s", "K");
else
System.out.printf("%4d", board[i][j]);
System.out.printf("\n");
}
// 输出
}
}
分享到:
相关推荐
在解决骑士巡游问题时,回溯法会尝试不同的骑士移动,如果在某个点发现无法继续满足“每个格子只访问一次”的条件,就回退到之前的状态,尝试其他可能性。 具体到这个程序,它首先会定义一个棋盘,每个格子可以表示...
这个问题源自国际象棋,其中骑士作为棋子,需要在标准的8x8棋盘上按照其特有的移动方式(每次移动两格横向加一格纵向,或者两格纵向加一格横向)依次访问每一个方格,且每个方格只能被访问一次。这要求我们找到一种...
在6*6的棋盘中任意位置放置马,使其跳满所有的点并且不重复
利用回溯法编程求解国际象棋中的骑士巡游问题。 关于实验中骑士的起始位置(坐标从左上角开始算起) 第一组:(1,1); 第二组:(1,2); … …依次类推 第九组:(2,1); output.txt中输出所得到的巡游路径...
在VC6++里运行的骑士巡游问题,输入初始位置就可以立即运行。
这个问题是NP完全问题,解决这个问题需要使用回溯法。 在给定的程序中,我们可以看到,Knight类被封装了,包括了初始化、打印、游历等函数。Knight类的成员变量包括: * `var_x`和`var_y`数组,用于记录骑士移动后...
在C++编程中,骑士巡游通常通过回溯法或者动态规划等方法解决。回溯法是一种试探性的解决问题的方法,当发现当前选择可能导致无法达到目标时,就撤销该选择,尝试其他的可能性。这种策略与八皇后问题的解决方法类似...
dfs中的回溯法,poj2488骑士游历,主要是回溯要将所有的点都遍历到。
在这个项目"基于C++实现回溯法解决骑士巡游问题.zip"中,我们可以深入探讨以下几个重要的知识点: 1. **C++编程语言**:C++是一种静态类型的、编译式的、通用的、大小写敏感的、不仅支持过程化编程,也支持面向对象...
【骑士巡游的算法】通常使用回溯法或者深度优先搜索(DFS)来解决。回溯法是一种试探性的解决问题的方法,当发现当前选择可能导致无法找到解决方案时,会退回一步重新尝试其他路径。在骑士巡游问题中,我们可以尝试...
在这个实现中,我们使用了回溯法和优化技术来实现骑士巡游问题的解决方案。回溯法是一种常用的搜索算法,它通过递归地搜索所有可能的路径来寻找解决方案。在这个实现中,我们使用了非递归的形式来避免递归深度的限制...
4. **算法实现**:骑士巡游的解决方案通常涉及回溯法或者位运算。回溯法是一种试探性的解决问题的方法,当发现某一步走不通时,会退回一步,尝试其他路径。而位运算可以用来高效地表示和检查棋盘上的每个位置是否已...
1. **回溯算法**:骑士巡游问题通常采用回溯法来解决。回溯法是一种试探性的解决问题方法,它尝试分步地构造解,每一步都检查当前状态是否满足目标条件。如果不满足,则撤销最后一步,尝试其他可能的路径。在骑士...
骑士巡游问题的解并不唯一,所以程序应能找出所有可能的解决方案。 最后,为了使游戏更具交互性,可以扩展程序,加入用户界面,允许用户输入棋盘大小并显示骑士的巡游路径。这需要学习Swing或JavaFX等Java GUI库。 ...
总的来说,骑士巡游的非递归算法是一种基于迭代和回溯的策略,它巧妙地规避了递归带来的复杂性,更适合处理大规模的问题。理解并实现这个算法不仅可以帮助你掌握数据结构和算法的基础,还能提升解决实际问题的能力。...
骑士巡游问题可以使用回溯法来解决,以下是骑士巡游算法的详细解释。 回溯法是一种通用性解法,可以将回溯法看作是带优化的穷举法。回溯法的基本思想是在一棵含有问题全部可能解的状态空间树上进行深度优先搜索,解...
"wdf"可能是算法或程序的标识,"骑士巡游"是指一个经典的图论问题,来源于国际象棋,指骑士在棋盘上能否通过每次移动两格横行和一格竖行(或反之)遍历所有位置而不重复。此问题属于组合优化和图论领域,具有NP完全...
解决骑士巡游问题的主要方法之一是采用回溯算法。回溯算法是一种试探性搜索策略,通过深度优先搜索(DFS)尝试所有可能的路径,并在遇到死路时回溯,撤销前几步的选择,再尝试其他路径。在骑士巡游问题中,算法首先...
"回溯法解决数独问题" 本文主要介绍了使用 MATLAB 解数独问题的回溯法解决方法。数独是一种非常流行的智力游戏,需要填充 9x9 的方格,使每一行、每一列、以及所分出的 9 个主要 3x3 区块,包含 1 到 9 所有的数字...
骑士巡游问题源自国际象棋,目标是在一个给定大小的棋盘上让骑士移动,使得每格棋盘至少被访问一次且不重复。在C++中解决这个问题,我们可以采用多种算法,如深度优先搜索(DFS)、广度优先搜索(BFS)或...