当我运行程序而不是找到骑士之旅时,我收到了一个StackOverflow错误。任何想法是什么导致了这一点,以及我如何改变我的代码,实际上找到骑士之旅,并摆脱这个错误。项目是为我的CS280课程,并在周五到期,请帮助。谢谢!!
public class KnightsTourDriver {
public static void main (String[]args) {
KnightsTour tour1 = new KnightsTour;
tour1.findTour(1);
tour1.displayTour();
}
}
import java.util.Arrays;
class KnightsTour
{
static int the_board[][] = new int[8][8];
int the_tour[][] = new int [8][8];
int k,moves = 0;
int x = 0, y = 0;
int z, j = 1;
boolean tour_found, isSafe;
//fills 2D array with 0's
public KnightsTour()
{
for (int i = 0; i < 8; i++)
{
for (int r = 0; r < 8; r++)
{
the_board[i][r] = 0;
}
}
}
/*recursive method, checks how many moves were made if 16 were made tour finished,
else if not moves knight checks if the move is valid if not back tracks*/
public void findTour(int q)
{
if(moves == 64)
{
tour_found = true;
}
else
move(q);
if(isSafe == true)
{
findTour(q++);
moves++;
}
else
if(isSafe == false)
{
findTour(q*(-1));
moves--;
}
}
//used to keep prevent arrayindexoutofbounds error
public boolean arrayInBounds(int x, int y)
{
if(x < 8 && y < 8 && x >= 0 && y >= 0)
{
return true;
}
else return false;
}
/*move method uses switch statement to decide which move the knight should make
based on a case number, negative case numbers back track knight. if statement checks
if the current array element is empty and the index is inbounds*/
public void move(int a)
{
switch (a)
{
case 1:
if(arrayInBounds(x+2, y+1) == true){
if(the_board[x+2][y+1] != 0){
the_board[x+2][y+1]=j;
j++;
break;
}
else isSafe = false;
break;
}
else isSafe = false;
case 2:
if (arrayInBounds(x+1, y+2) == true){
if(the_board[x+1][y+2] != 0){
the_board[x+1][y+2]=j;
j++;
break;
}
else isSafe = false;
break;
}
else isSafe = false;
case 3:
if(arrayInBounds(x-1, y+2) == true){
if(the_board[x-1][y+2] != 0){
the_board[x-1][y+2]=j;
j++;
break;
}
else isSafe = false;
break;
}
else isSafe = false;
case 4:
if (arrayInBounds(x-2, y+1) == true){
if(the_board[x-2][y+1] != 0){
the_board[x-2][y+1]=j;
j++;
break;
}
else isSafe = false;
break;
}
else isSafe = false;
case 5:
if(arrayInBounds(x-2, y-1) == true){
if(the_board[x-2][y-1] != 0){
the_board[x-2][y-1]=j;
j++;
break;
}
else isSafe = false;
break;
}
else isSafe = false;
case 6:
if(arrayInBounds(x-1, y-2) == true){
if(the_board[x-1][y-2] != 0){
the_board[x-1][y-2]=j;
j++;
break;
}
else isSafe = false;
break;
}
else isSafe = false;
case 7:
if(arrayInBounds(x+1, y-2) == true){
if(the_board[x+1][y-2] != 0){
the_board[x+1][y-2]=j;
j++;
break;
}
else isSafe = false;
break;
}
else isSafe = false;
case 8:
if(arrayInBounds(x+2, y-1) == true){
if(the_board[x+2][y-1] != 0){
the_board[x+2][y-1]=j;
j++;
break;
}
else isSafe = false;
break;
}
else isSafe = false;
case -1:
j--;
tryNextMove(a);
break;
case -2:
j--;
tryNextMove(a);
break;
case -3:
j--;
tryNextMove(a);
break;
case -4:
j--;
tryNextMove(a);
break;
case -5:
j--;
tryNextMove(a);
break;
case -6:
j--;
tryNextMove(a);
break;
case -7:
j--;
tryNextMove(a);
break;
case -8:
j--;
tryNextMove(a);
break;
}
}
public void tryNextMove(int m)
{
move(m++);
}
//for loop to display tour once found//
public void displayTour()
{
int v = 1;
for (int i = 0; i < 8; i++)
{
for (int e = 0; e < 8; e++)
{
if(v % 8 == 0)
{
System.out.print(the_board[i][e] + "\t");
System.out.println("\n");
}
else
System.out.print(the_board[i][e] + "\t");
v++;
}
}
}
}
您需要在开关中的case语句中进行一些Rest,否则它就会失败。
我正在尝试编写骑士之旅递归算法: 谁能告诉我哪里出错了?我已经一步一步地检查了什么池算法正在添加到列表中。什么是大惊奇算法在添加4,3池和6,4池后,应该用6,4作为实际位置来称呼它自己,但我不知道为什么它用4,3作为实际位置来称呼自己。
另一个经典问题,我们可以用来说明第二个通用图算法称为 “骑士之旅”。骑士之旅图是在一个棋盘上用一个棋子当骑士玩。图的目的是找到一系列的动作,让骑士访问板上的每格一次。一个这样的序列被称为“旅游”。骑士的旅游难题已经吸引了象棋玩家,数学家和计算机科学家多年。一个 $$8 \times 8$$ 棋盘的可能的游览次数的上限为 $$1.305 \times 10^{35}$$ ;然而,还有更多可能的死胡同
我正在尝试编写一个骑士之旅算法,它有两个数组,访问和板。ACCESS是我用来判断下一步是什么的数组,board是用户将看到的最终结果的数组。我的算法通过检查找到可用移动次数最少的正方形,然后到达那里。如果恰好有两个可能的移动,并且可用的移动次数相同,我会找到哪一个离中心最远(离边界最近),然后移动到该点。这个算法应该会一直提供一个完美的64步骑士巡演程序,但我通常只得到大约60步,有人能告诉我为什
《FG 骑士进度条》是《异星工厂网页版》作者基于《骑士进度条 2》复刻的另一款放置游戏,相对来说,界面看起来像是一款游戏了。玩法上变化不大,增加了成就功能。 可以导入《骑士进度条2》的存档,接档直接玩。
有最后关于骑士之旅一个有趣的话题,然后我们将继续到深度优先搜索的通用版本。主题是性能。特别是,knightTour 对于你选择下一个要访问的顶点的方法非常敏感。例如,在一个5乘5的板上,你可以在快速计算机上处理路径花费大约1.5秒。但是如果你尝试一个 $$8 \times 8$$ 的板,会发生什么?在这种情况下,根据计算机的速度,你可能需要等待半小时才能获得结果!这样做的原因是我们到目前为止所实现
我们将用来解决骑士旅游问题的搜索算法称为 深度优先搜索(DFS)。尽管在前面部分中讨论的广度优先搜索算法一次建立一个搜索树,但是深度优先搜索通过尽可能深地探索树的一个分支来创建搜索树。在本节中,我们将介绍实现深度优先搜索的两种算法。我们将看到的第一个算法通过明确地禁止一个节点被访问多次来直接解决骑士的旅行问题。第二种实现是更通用的,但是允许在构建树时多次访问节点。第二个版本在后续部分中用于开发其他