我正在尝试解决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
答案 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)
弹出第一个元素。