Java 达到国际象棋目标的最小步数-使用BFS穿越骑士
下面给出的代码可以有效地处理小于13的国际象棋,但在这之后,它会花费太多时间并永远运行。 我想缩短到达结束节点的时间。 该代码还查找从starti、startj到endi、endj的最小路径,其中starti和startj的值从1到n-1 以下是我试图解决的问题: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
节目:
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;
}