【问题标题】:Unable to solve a codechef puzzle?无法解决 codechef 难题?
【发布时间】:2023-04-01 15:06:02
【问题描述】:

我正在尝试解决 this 显然是初学者级别的问题。但甚至无法想出一个蛮力的方法。

这是问题陈述:

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

这个谜题是一个 3x3 的棋盘,由 1 到 9 的数字组成。这个谜题的目标是交换棋子,直到达到以下最终状态:

1 2 3
4 5 6
7 8 9

在每一步,如果它们的和是质数,Johnny 可以交换两个相邻的图块。如果两个图块有共同的边缘,则它们被认为是相邻的。

帮助 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

【问题讨论】:

  • 您的问题到底是什么?你可以说得更详细点吗?不要指望社区在线解决这个问题。但是,如果您有非常具体的问题,我们可以提供帮助。
  • 是的,我也不希望人们为我解决这个问题。我想要的只是一种开始的方法。我什至想不出一个直接和蛮力的方法来开始。所以我正在寻求任何提示或想法,即使它是简单的英语而不是伪代码。
  • 你想学习像 Dijkstra 和 BFS 这样的图算法。
  • 您必须搜索可能的“动作”。您可以使用递归来跟踪所有解决方案中最短的解决方案。 BFS 算法将是首选,但这是一个相对较小的搜索树,因此 DFS 也可以(因此递归)。
  • 我认为问题的分类是错误的——BFS 是正确的方法(我点击了一些解决方案来查看他们正在做的事情)。我将其称为中级问题,而不是初学者级问题。

标签: algorithm


【解决方案1】:

这是 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) 获得第一个元素。

【讨论】:

    猜你喜欢
    • 2023-02-02
    • 2017-02-28
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 2020-04-12
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多