首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >8益智可解规则是否适用于任何目标状态?

8益智可解规则是否适用于任何目标状态?
EN

Stack Overflow用户
提问于 2016-03-19 23:00:55
回答 2查看 2.2K关注 0票数 0

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

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

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

代码语言:javascript
复制
   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

现在我的观察是,如果目标状态是目标State2,那么可解性检查就可以了。但是,如果目标状态是目标state1,则不会工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-20 00:55:40

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

但是,由于实际上有两类国家(基于奇偶原则),而你只能通过采取法律行动--即,当你采取合法行动时,平等是不变的--将这一原则推广到任何目标状态:

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

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

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

代码语言: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;
}
代码语言:javascript
复制
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>

票数 1
EN

Stack Overflow用户

发布于 2016-03-20 01:11:39

是的,确实有用。有一个非常微不足道的方式来展示这一点。只需将解决方案中的值映射到我们假设为您的GoalState2的值,对此检查是有效的:

代码语言:javascript
复制
state we want to reach   Goal State2
3   1   5                1   2   3
6   4   8                4   5   6
2   0   7                7   8   0

map:
3 -> 1
1 -> 2
3 -> 5
...

现在,将此表应用于开始状态,将每个值替换为映射到的值,以用于GoalState2的方式解决整个问题,并对最终状态进行映射。如果有你想要的结果,你就在这里。可解性规则可以在不改变一点的情况下重用,只需使用简单的重映射。

说明了这是如何工作的:

代码语言:javascript
复制
state we want to reach   Goal State2
3   1   5                1   2   3
6   4   8                4   5   6
2   0   7                7   8   0

build map

map:
3 -> 1
1 -> 2
3 -> 5
...

Start state
3   1   5   apply map  1  2  3  solve for  1  2  3  apply        3  1  5
6   0   4   -------->  4  8  5  -------->  4  5  6  --------->   6  4  8
2   7   8              7  0  6   GoalS2    7  8  0  reverse map  2  0  7

这是最琐碎的解决方法。只要把数字当作没有任何意义的标签,你就已经做到了一半。

要获得更复杂的答案,让您更好地理解规则本身,请查看@trincots的答案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36108269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档