无法解决密码厨师难题?

时间:2018-08-17 11:32:08

标签: algorithm

我正在尝试解决this显然是初学者级别的问题。但甚至无法提出暴力手段。

这是问题陈述:

  

约翰尼在记住小的素数方面有些困难。因此,他的计算机科学老师要求他经常玩以下益智游戏。

     

拼图是一个由1到9的数字组成的3x3棋盘。拼图的目的是交换图块,直到达到以下最终状态:

1 2 3
4 5 6
7 8 9
     

在每个步骤中,如果相邻的小块的总和是质数,则约翰尼可以交换两个小块。如果两个图块具有相同的边缘,则将它们视为相邻。

     

帮助Johnny查找达到目标状态所需的最短步骤。

     

输入

     

第一行包含 t ,即测试用例的数量(约50个)。然后是 t 测试用例。每个测试用例均包含一个3x3的表格,其中描述了Johnny想解决的难题。

     

连续测试用例的输入数据用空白行分隔。

     

输出

     

对于每个测试用例,请打印一行,其中包含解决相应难题所需的最短步骤。如果无法达到最终状态,请打印数字-1。

     

示例

     

输入:

2
7 3 2 
4 1 5 
6 8 9 

9 8 5 
2 4 1 
3 7 6  
     

输出:

6
-1

1 个答案:

答案 0 :(得分:0)

这是Python的起点,用于查找从起点到所有木板的距离。

start = '123456789'
needed_moves = {start: 0}
work_queue = [start]
while (len(work_queue)):
    board = work_queue.pop(0)
    for next_board in next_move(board):
        if next_board not in needed_moves:
            needed_moves[next_board] = needed_moves[board] + 1
            work_queue.append(next_board)

这是广度优先搜索的标准模式。只需提供一个next_move函数和一些用于测试用例的胶水,就可以了。

对于深度优先搜索,只需将队列切换为堆栈。这实际上意味着work_stack.pop()弹出最后一个元素,而不是work_queue.pop(0)弹出第一个元素。