graph - 通过交换转换矩阵的最小步骤数
解决方案
没有办法做到这一点,除非通过暴力,递归。对于每个位置不正确的图块,最多可以进行 4 次交换。您进行交换,然后将此新位置添加到您未尝试过的列表中,确保不要回到您以前见过的任何位置。跟踪递归的深度,当你得到最终位置时,深度就是答案。
incoming = (7,3,2,4,1,5,6,8,9)
answer = (1,2,3,4,5,6,7,8,9)
primes = (2,3,5,7,11,13,17)
def solve(base, depth):
seen = set()
untried = [(base,0)]
while untried:
array,depth = untried.pop(0)
print(depth, array)
if array == answer:
print( "ANSWER!", depth )
return depth
if array in seen:
print("seen")
continue
seen.add( array )
for n in range(9):
if array[n] == n+1:
continue
for dx in (-1, -3, 1, 3):
if 0 <= n+dx < 9 and array[n]+array[n+dx] in primes:
# attempt a swap.
a = list(array)
a[n],a[n+dx] = a[n+dx],a[n]
untried.append((tuple(a),depth+1))
print( "fail" )
return -1
solve( incoming, 0 )
推荐阅读
- r - 如何在R中按组创建一个新变量,它是列的总和?
- python - Pandas JSON 规范化并合并回表格
- c# - 如何创建聊天窗口
- javascript - 在 TypeScript 中导入“何时”
- css - 用于更改主导航背景颜色的 CSS
- node.js - nodejs我如何过滤对象数组
- python - AttributeError:“pygame.Surface”对象没有属性“事件”
- arrays - 如何将此总和集成到 ArrayFormula?
- javascript - 有没有办法可以为本地存储中的每个按钮设置单独的背景图像?
- flutter - 在 Flutter 中杀死应用程序后保留数据