Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何找到8-字谜的所有可能状态?_Java_Algorithm_Depth First Search_Sliding Tile Puzzle - Fatal编程技术网

Java 如何找到8-字谜的所有可能状态?

Java 如何找到8-字谜的所有可能状态?,java,algorithm,depth-first-search,sliding-tile-puzzle,Java,Algorithm,Depth First Search,Sliding Tile Puzzle,我知道有9个!可能的状态和9/2个可解状态,但我希望能够编写一个算法,使用深度优先搜索找到所有可能的状态,并将它们记录在数组中。我将使用Java,但如果有人能提供帮助的话,这更像是我所追求的理论?您可以使用迭代算法,比如通过交换迭代数组的所有排列 当掉期中不涉及“差额”时,掉期将切换奇偶校验。换句话说,如果你解决了这个难题,然后拿出两块,然后把它们放回彼此的位置,那么这个难题就再也解决不了了。用任意两块重复上述步骤,谜题就可以再次解决了 只有当这两个位置之间的滑行距离相等时,用“间隙”交换工件才

我知道有9个!可能的状态和9/2个可解状态,但我希望能够编写一个算法,使用深度优先搜索找到所有可能的状态,并将它们记录在数组中。我将使用Java,但如果有人能提供帮助的话,这更像是我所追求的理论?

您可以使用迭代算法,比如通过交换迭代数组的所有排列

当掉期中不涉及“差额”时,掉期将切换奇偶校验。换句话说,如果你解决了这个难题,然后拿出两块,然后把它们放回彼此的位置,那么这个难题就再也解决不了了。用任意两块重复上述步骤,谜题就可以再次解决了

只有当这两个位置之间的滑行距离相等时,用“间隙”交换工件才会切换奇偶性

因此,如果您实现了Heap算法并使用上述两个规则更新奇偶校验,那么您可以为每个排列决定是否包含它:

int[] a = {1,2,3,4,5,6,7,8,0}; // 0 represents "gap"
int[] stack = {0,0,0,0,0,0,0,0,0};

System.out.println(Arrays.toString(a));

boolean parity = true;
int i = 0;
int n = a.length;
while (i < n) {
    if (stack[i] < i) {
        int j = i % 2 > 0 ? stack[i] : 0;
        // SWAP a[i], a[j] 
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
        // Toggle parity when "gap" is not moved
        // or it is moved with even taxicab distance
        if (a[i] > 0 && a[j] > 0 || ((i^j)&1) == 0) parity = !parity;
        if (parity) System.out.println(Arrays.toString(a));
        stack[i]++;
        i = 0;
    } else {
        stack[i++] = 0;
    }
}
int[]a={1,2,3,4,5,6,7,8,0};//0代表“差距”
int[]堆栈={0,0,0,0,0,0,0,0};
System.out.println(Arrays.toString(a));
布尔奇偶校验=真;
int i=0;
int n=a.长度;
而(i0?堆栈[i]:0;
//互换a[i],a[j]
int temp=a[i];
a[i]=a[j];
a[j]=温度;
//不移动“间隙”时切换奇偶校验
//或者,它以均匀的滑行距离移动
如果(a[i]>0&&a[j]>0 | |((i^j)&1)==0)奇偶校验=!奇偶校验;
if(奇偶校验)System.out.println(Arrays.toString(a));
堆栈[i]++;
i=0;
}否则{
堆栈[i++]=0;
}
}

你考虑过这个理论吗?这不是一个真正的编程问题,而是一个数学/逻辑问题:找到算法是困难的部分,实现它是一个不同的主题!8字谜的可能状态只是数字(0,1,2,…,8)的排列,其中0表示空白。任何生成输入数组所有排列的算法都会找到它们。可解的一半是“偶数”置换;有一种简单的方法可以测试排列是否为偶数,您应该可以通过搜索找到。