Java 如何找到8-字谜的所有可能状态?
我知道有9个!可能的状态和9/2个可解状态,但我希望能够编写一个算法,使用深度优先搜索找到所有可能的状态,并将它们记录在数组中。我将使用Java,但如果有人能提供帮助的话,这更像是我所追求的理论?您可以使用迭代算法,比如通过交换迭代数组的所有排列 当掉期中不涉及“差额”时,掉期将切换奇偶校验。换句话说,如果你解决了这个难题,然后拿出两块,然后把它们放回彼此的位置,那么这个难题就再也解决不了了。用任意两块重复上述步骤,谜题就可以再次解决了 只有当这两个位置之间的滑行距离相等时,用“间隙”交换工件才会切换奇偶性 因此,如果您实现了Heap算法并使用上述两个规则更新奇偶校验,那么您可以为每个排列决定是否包含它:Java 如何找到8-字谜的所有可能状态?,java,algorithm,depth-first-search,sliding-tile-puzzle,Java,Algorithm,Depth First Search,Sliding Tile Puzzle,我知道有9个!可能的状态和9/2个可解状态,但我希望能够编写一个算法,使用深度优先搜索找到所有可能的状态,并将它们记录在数组中。我将使用Java,但如果有人能提供帮助的话,这更像是我所追求的理论?您可以使用迭代算法,比如通过交换迭代数组的所有排列 当掉期中不涉及“差额”时,掉期将切换奇偶校验。换句话说,如果你解决了这个难题,然后拿出两块,然后把它们放回彼此的位置,那么这个难题就再也解决不了了。用任意两块重复上述步骤,谜题就可以再次解决了 只有当这两个位置之间的滑行距离相等时,用“间隙”交换工件才
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表示空白。任何生成输入数组所有排列的算法都会找到它们。可解的一半是“偶数”置换;有一种简单的方法可以测试排列是否为偶数,您应该可以通过搜索找到。