algorithm - 8 个难题可解性规则是否适用于任何目标状态?

标签 algorithm sliding-tile-puzzle

我了解到,可以通过遵循特定规则来检查 8 字谜题的可解性。 https://www.cs.bham.ac.uk/~mdr/teaching/modules04/java2/TilesSolvability.html

http://ldc.usb.ve/~gpalma/ci2693sd08/puzzleFactible.txt .

我的问题是,这种可解性检查是否仅在目标状态(解决方案)处于正确的升序时才适用? 示例:

   Start state
    3   1   5 
    6   0   4 
    2   7   8

    Goal state1        Goal State2
    3   1   5           1   2   3
    6   4   8           4   5   6
    2   0   7           7   8   0

现在我的观察是,如果示例中的目标状态是目标状态 2,则可解决性检查将起作用。但如果目标状态是目标状态 1,它就不起作用。

最佳答案

反转计数可以是奇数或偶数,简而言之,我们可以称一个状态为偶数或奇数。这称为状态的平价。如果起始状态是偶数,那么它是可解的。在引用的文章中,这确实意味着目标必须是具有增量顺序的目标。

但由于实际上有两类状态(基于奇偶性),并且您只能通过合法移动保持在这两个类中的一个 - 即当您进行合法移动时奇偶性是不变的 - 这个原则可以扩展到任何目标状态:

如果起始状态的奇偶性与目标状态的奇偶性相同,则它是可达的(可解的)。

在您给出的示例状态中,起始状态是奇数,第一个目标状态也是奇数。所以他们属于同一个类,一个可以从另一个到达。

这是 JavaScript 中奇偶校验的简单实现。它也适用于大小均匀的网格:

function parity(grid) {
    var inversions = 0;
    // take copy and remove blank (0) from it.
    var arr = grid.slice(0);
    arr.splice(arr.indexOf(0), 1);
    // perform sort and count swaps
    for (var i = 1; i < arr.length; i++) {
        for (var j = i - 1; j >= 0; j--) {
            if (arr[j] <= arr[j+1]) break;
            [arr[j+1], arr[j]] = [arr[j], arr[j+1]];
            inversions++;
        };
    }
    if (grid.length % 2 == 0) { // even grid width
        var size = Math.round(Math.sqrt(grid.length));
        var blankRow = Math.floor((grid.length - 1 - grid.indexOf(0)) / size);
        inversions += blankRow;
    }
    return inversions & 1; // only odd/even is needed as info
}

document.querySelector('button').onclick = function() {
    var res = '';
    var txt = document.querySelector('textarea');
    var grid = txt.value.trim().split(/[,\s]+/g).map(Number);
    var size = Math.round(Math.sqrt(grid.length));
    var res = size*size !== grid.length
            ? 'input is not a complete square matrix of data'
            : 'parity = ' + parity(grid);
    document.querySelector('pre').textContent = res;
}
Enter grid. 0 represents empty slot.<br>
<textarea rows=4>3   1   5 
6   0   4 
2   7   8
</textarea><button>Verify</button><br>
<pre></pre>

关于algorithm - 8 个难题可解性规则是否适用于任何目标状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36108269/

相关文章:

python - 在 A* 搜索中选择/排序最佳节点的更有效方法是什么?

r - 如何计算机器学习中的对数损失

python - 根据产品数量计算 PDF 中的页面

python - 判断一个值是否在倍数范围内的算法

java - 使用 A* 算法解决 8 拼图板(Board 数据类型工作正常)

java - 8 使用 A* 解决难题 : a child node repeating its ancestor's state

javascript - 如何绘制思维导图

使用 fork-join 进行 Java 多路树搜索

java - 如何在一维数组Java中上下左右搜索

algorithm - 解决8个难题的有效方法是什么?