- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试递归地实现骑士之旅..下面是我的代码。为简单起见,我选择了 5x5 的板。我的目标是打印出正确的马位置,并可能在打印语句的同时显示回溯。
class Knight
{
public boolean[][] board = new boolean[5][5];
public final int SQUARES = 5*5-1;
public Knight()
{
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
board[i][j] = false;
}
public boolean tour(int x, int y, int visitedX, int visitedY,int n)// x,y coords, just visited x,y and counter n
{
if(x>=5||y>=5||x<0||y<0){ //out of bounds
System.out.println("Visited "+x+", "+y+" Out of bounds");
System.out.println("Back to "+visitedX+", "+visitedY);
return false;
}
else{
if(board[x][y] == true)
{return false;}
if(board[x][y]!=true){
boolean result = false;
board[x][y]=true;
System.out.println("Visited "+x+", "+y);
result = tour(x+2,y+1,x,y,n+1);
result = tour(x+2,y-1,x,y,n+1);
result = tour(x+1,y-2,x,y,n+1);
result = tour(x-1,y-2,x,y,n+1);
result = tour(x+1,y+2,x,y,n+1);
result = tour(x-1,y+2,x,y,n+1);
result = tour(x-2,y-1,x,y,n+1);
result = tour(x-2,y+1,x,y,n+1);
}
}
return false;
}
}
public class KnightTApp {
public static void main(String[] args) {
Knight k = new Knight();
k.tour(0,0,0,0,0);
}
}
部分打印输出
Visited 4, 0
Visited 6, 1 Out of bounds
Back to 4, 0
Visited 6, -1 Out of bounds
Back to 4, 0
Visited 5, -2 Out of bounds
Back to 4, 0
Visited 3, -2 Out of bounds
Back to 4, 0
Visited 5, 2 Out of bounds
Back to 4, 0
Visited 2, -1 Out of bounds
Back to 4, 0
Visited 2, 0
我的问题是在这个过程的中间,我在索引 4,0 处遇到了死胡同(并非所有方 block 都被覆盖,但我无法进行合法的移动)。因为我没有包含任何回溯行。它只是跳转到索引 2,0,这甚至不是合法的骑士举动。
我的问题是如何用 if 语句表达死胡同?我认为我应该将递归设置为某种 boolean 值并从那里开始,但我不知道该怎么做。
使用递归是否与使用 DFS(深度优先搜索)相同,因为它们基本上具有相同的想法?
提前谢谢您。
最佳答案
您需要弄清楚您是否正在尝试识别所有可能的旅行或者只是为了找到一个有效的游览。
要获得完整的回溯,您需要在游览结束时返回调用者处时再次将板字段标记为空闲。
其次,您需要检查 tour()
上每个递归调用的结果。如果 true 你找到了一个有效的星座,你也可以返回 true。否则尝试下一个可能的 Action 。如果没有向左移动,则返回 false。
最后你缺少一个适当的终止条件:“什么是成功?”在您的情况下,如果您成功移动了 5x5
,则所有字段都已被访问,您可能只返回 true
表示成功。
您可能还想跟踪移动顺序,以便有机会输出成功的游览。
以上目标是确定一次成功的巡演。
通过跟踪移动顺序,您可以跟踪所有成功的游览,而不仅仅是在最深的递归检查已知游览中返回 true,如果是新的游览则返回 true。
作为引用,您的代码的修改版本解决了“查找任何”部分:
class Knight {
public final static int SIZE = 5;
public boolean[][] board = new boolean[SIZE][SIZE];
public String[] moves = new String[SIZE * SIZE];
public Knight() {
for (int i = 0; i < 5; i++ ) {
for (int j = 0; j < 5; j++ ) {
board[i][j] = false;
}
}
}
public boolean tour(final int x, final int y, final int n)
{
if (n >= SIZE * SIZE) {
return true;
} else if (x >= 5 || y >= 5 || x < 0 || y < 0) { // out of bounds
return false;
} else if (board[x][y]) {
return false;
} else {
// System.out.println("Checking " + n + ": " + x + "," + y);
board[x][y] = true;
moves[n] = x + "-" + y;
if (tour(x + 2, y + 1, n + 1)) {
return true;
}
if (tour(x + 2, y - 1, n + 1)) {
return true;
}
if (tour(x + 1, y - 2, n + 1)) {
return true;
}
if (tour(x - 1, y - 2, n + 1)) {
return true;
}
if (tour(x + 1, y + 2, n + 1)) {
return true;
}
if (tour(x - 1, y + 2, n + 1)) {
return true;
}
if (tour(x - 2, y - 1, n + 1)) {
return true;
}
if (tour(x - 2, y + 1, n + 1)) {
return true;
}
board[x][y] = false;
moves[n] = null;
return false;
}
}
public static void main(final String[] args) {
final Knight k = new Knight();
for (int i = 0; i < SIZE; i++ ) {
System.out.println("Starting at " + i + " 0");
if (k.tour(i, 0, 0)) {
k.printTour(true);
break;
}
k.printTour(true);
}
}
/**
* @param result
*/
private void printTour(final boolean result) {
System.out.println("Found tour: " + result);
int i = 0;
if (result) {
for (final String m : moves) {
System.out.println("M-" + i + ": " + moves[i]);
i++ ;
}
}
}
}
关于java - Java骑士之旅递归方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36187685/
我尝试运行稍微修改过的 horsemanjs 的示例代码: var Horseman = require('node-horseman'); var horseman = new Horseman()
我在 Isometric camera with THREE.js 中找到了有关如何创建(轴测)等距相机的示例,但如何创建轴测斜线? 最佳答案 您可以渲染带有倾斜的场景 cabinet perspec
我正在尝试在 horseman 的 evalute 函数中使用 promises。一个简单的例子: var Horseman = require('node-horseman'); var horse
我试图在调试期间查看 List<> 的内容。不幸的是我看不到它们,因为我在变量窗口中收到以下消息: corvalue.GetExactTypeSafe(out type). The object is
Rider IDE 通知我以下内容效率低下 transform.Translate(moveDirection * speed * Time.smoothDeltaTime); 并想将
是否有一种简单的方法可以在 Visual Studio 之外使用旧的 EF 来搭建脚手架迁移?如果可能的话,我想通过 Rider IDE 来完成。 最佳答案 对于 EF Core,您可以使用 http
在 Rider 中,当在断点处暂停时,有没有办法在调试器堆栈帧中实际显示“外部代码”? 在 Visual Studio 中,这可以轻松完成,但在 Rider 中似乎不可能。而且,是的,我启用了“exa
我试图通过更改其环境变量来修改 Linux 上 JetBrains Rider 中 .NET 项目的设置配置文件。但是,当我点击文件夹图标时,我无法点击添加、删除或修改任何环境变量。 我注意到在 Ri
只是试用 Rider 并遇到了这个问题,如果我只是构建 Xamarin Android 项目 - 它构建得非常好,但是如果我尝试运行它,它会在部署步骤失败并出现以下错误: ▼ Project Not
当我在 Jetbrains Rider EAP 21 中创建解决方案时,我在解决方案资源管理器窗口中收到“(缺少包)”错误。 然后,我尝试构建项目并获得 [MSB4057] 错误。 尽管如此,我可以通
我是一名优秀的程序员,十分优秀!