Java 达到国际象棋目标的最小步数-使用BFS穿越骑士

Java 达到国际象棋目标的最小步数-使用BFS穿越骑士,java,algorithm,search,graph-algorithm,game-theory,Java,Algorithm,Search,Graph Algorithm,Game Theory,下面给出的代码可以有效地处理小于13的国际象棋,但在这之后,它会花费太多时间并永远运行。 我想缩短到达结束节点的时间。 该代码还查找从starti、startj到endi、endj的最小路径,其中starti和startj的值从1到n-1 以下是我试图解决的问题: 节目: import java.util.LinkedList 导入java.util.Scanner; 类节点{ int x,y,dist; 节点(整数x,整数y,整数dist){ 这个.x=x; 这个。y=y; this.dis

下面给出的代码可以有效地处理小于13的国际象棋,但在这之后,它会花费太多时间并永远运行。 我想缩短到达结束节点的时间。 该代码还查找从starti、startj到endi、endj的最小路径,其中starti和startj的值从1到n-1

以下是我试图解决的问题:

节目:

import java.util.LinkedList
导入java.util.Scanner; 类节点{ int x,y,dist; 节点(整数x,整数y,整数dist){ 这个.x=x; 这个。y=y; this.dist=dist; } 公共字符串toString(){ 返回“x:+x+”y:+y+“距离:”+dist; } } 类解决方案{ 公共静态布尔校验界(整数x,整数y,整数n){
如果(x>0&&y>0&&x即使优化了代码,也不会降低算法的复杂性

我认为你需要考虑如何减少搜索空间,或者以一种巧妙的顺序进行搜索


我会选择一个

如果设置
已访问
太晚,并且相同的单元格被多次添加到队列中,然后您在不检查其已访问状态的情况下将其从队列中弹出,这会使事情变得更糟。这会导致队列的快速增长

节点
添加到队列后,需要立即设置
已访问

if(checkBound(x,y,n) && !visited[x][y]) {
    queue.add(new Node(x,y,z.dist+1)); 
    visited[x][y] = true;   
}

在你的问题中最有效的解决方案是。将方块视为节点,并向骑士可以访问的其他方块/节点绘制边。然后运行此图的算法。它在对数时间内执行,因此它可以很好地缩放大问题

史密斯先生提出的搜索建议是一种启发式方法,所以我不建议将其用于此类问题


Dijkstra是一个重要的算法,实现它将帮助您在将来解决许多类似的问题,例如,您也可以使用相同的逻辑来解决问题。

更好地用于代码检查图形是未加权的,并且不需要使用Dijkstra或A*算法。BFS对于这个问题来说已经足够好了。他只是在实现。即使我同意一个未加权图BFS也是好的。你能让我知道更多关于我犯的错误吗?我认为Dale是对的,BFS在这里会工作得更好,因为边总是1。我只是过于热衷于使用Dijkstra,因为它是动态编程问题的更通用的解决方案(正如我引用的那个).由于图表未加权,我认为BFS应该更有效地完成这项工作。@swapnil:BFS只是*-搜索的一个特例。是的,这很有效,以前我修改了z.x和z.y,而不是x和y。谢谢
if(checkBound(x,y,n) && !visited[x][y]) {
    queue.add(new Node(x,y,z.dist+1)); 
    visited[x][y] = true;   
}