【问题标题】:Knight's Tour recursion骑士之旅递归
【发布时间】:2016-06-14 02:29:58
【问题描述】:

有人能在我的knight's tour code 中找到错误吗?我似乎找不到它,我得到一个无限循环,而不是堆栈溢出

private bool heuristic(int[,] board, int x, int y, ref int jmp)
{
    if (x < 0 || x > 7 || y < 0 || y > 7 || board[x, y] > 0)
        return false;
    board[x, y] = ++jmp;
    if (jmp == 64)
        return true;

    if (heuristic(board, x + 2, y + 1, ref jmp) ||
        heuristic(board, x + 2, y - 1, ref jmp) || heuristic(board, x - 2, y + 1, ref jmp) ||
        heuristic(board, x - 2, y - 1, ref jmp) || heuristic(board, x + 1, y + 2, ref jmp) ||
        heuristic(board, x + 1, y - 2, ref jmp) || heuristic(board, x - 1, y + 2, ref jmp) ||
        heuristic(board, x - 1, y - 2, ref jmp))
        return true;
    board[x, y] = 0;
    jmp--;
    return false;
}

并称它为:

var board = new int[8,8];
var x = 0;
var y = 0;
var jmp = 0;
var result = heuristic(board, x, y, ref jmp);

我需要有一个jmp 变量,因为我正在执行多次试验并且还想显示所采用的路径。 谢谢!

【问题讨论】:

  • 你有多确定这是一个无限循环,而不仅仅是花费非常非常长的时间?
  • @JohnBurger 这是一个 8x8 板。
  • @Stefan 那没有回答问题.. :) 能否请您提供起始条件,以便人们可以重现代码?即初始数组xyjmp?
  • 你有 8 个递归调用,每个调用都可以进行 63 深。 8^63 是一个非常非常大的数字。我知道绝不会每次通话都那么深入 - 但在被之前的访问“逼入绝境”之前,他们会从大量选项开始。
  • @Rob 一切都是0,包括初始矩阵,用0填充

标签: c# recursion knights-tour


【解决方案1】:

根据Wikipedia

有 26,534,728,821,064 [...] 个游览

除了最小的棋盘外,暴力搜索骑士之旅是不切实际的;例如,在一个 8x8 的棋盘上,大约有 4×1051 个可能的移动序列,而现代计算机(或计算机网络)在如此大的集合上执行操作远远超出了能力。然而,这个数字的大小给人一种对问题难度的误导性印象,“通过使用人类的洞察力和独创性......可以毫不费力地解决这个问题。”

【讨论】:

  • 分而治之?华恩斯多夫的规则?检查我链接的维基百科文章。 PhD 写了关于如何最好地做到这一点的文章......
  • Warnsdorf 的规则似乎是:对于每个可能的下一个位置,检查从 那里 可以到达多少个地方(换句话说,只走两个深度)。然后选择具有 最少 个未来选项的选项。如果不出意外,它将阻止完整的深度优先搜索......
  • 感谢您指出这一点,我在 Wikipedia 上读到了这一点,但出于某种原因,我没想到 8x8 板会深入到 DFS 中。我将递归调用切换为顺时针方向,它很快就解决了。我将添加 Warnsdorff 规则。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多