首页 > 解决方案 > 减少回溯算法的时间

问题描述

我正在尝试使用回溯解决问题。考虑到 n * n 数组(arr)的外观,并且 n <= 20,我必须使用回溯。我应该制作一个未按下所有按钮的给定形状。我可能有多个答案,但我应该以您按下按钮的最少次数打印答案。

按下按钮可更改按下按钮和上、下、左、右按钮的状态。# 未按下按钮,O 为按下按钮

例如,
4
OOOO
OOOO
OOOO
OOOO
作为输入给出


# O # #
# # O
O # #
# # O #
应该输出。

这意味着您可以通过四个操作(将按钮推到 O 位置)来制作输入给定的形状。

如果 n 为 20,我的源代码在最坏的情况下将需要大约 1 分钟。
有没有办法减少所需的时间?

但我不知道该怎么做。

我正在使用的当前没有希望的条件是,arr[row-1][col]并且temarr[row-1][col]在操作按钮时不一样temans[row][col]。这是因为在这个位置之后我无法改变 temarr [row-1] [col] 的外观。

开始:
按钮在 1,1 位置:p np
按钮在 1,2 位置:p np p np
...
按钮在 i,j 位置:p np...p np
按钮在 n,n 位置:p np.. .p np

我通过在树形的特定位置显示按下(p)和未按下(np)按钮的所有情况来解决这个问题。

我解决了这个问题

标签: algorithmbacktracking

解决方案


有没有办法减少所需的时间?

在更好的计算机上运行它?开个玩笑^^。

看来您是学生,而且看起来确实像家庭作业,所以我只是提供一些提示和线索。

  • 假设在您回溯的某个时刻,您“知道”(=compute)arr和之间有 35 个不同的值temarr。您也知道这一点count - temcount == 3(如果您想找到更好的解决方案,您只能按 2 个按钮)。您找到更好解决方案的可能性有多大?
  • compare功能:假设我将 20*20 = 4,000 张扑克牌放在桌子上。数了30分钟后,我知道1800个是“面朝上”,2200个是“面朝下”。现在我将 3 张牌从“面朝上”翻转到“面朝下”,然后以另一种方式翻转 2 张不同的牌。我是否必须再花 30 分钟数数才能得到 2 个总数?
    回到您的案例:每次修改 5 个值时temarr,您是否必须将其所有值与arr's 值重新比较以测试它们是否不同?
  • 您当前计算temarr的唯一目的是将其与 进行比较arr,并且您经常进行比较。您可以直接处理两个数组的“差异”:这意味着您有一个数组来判断哪个值是“正确的”或“错误的”。

推荐阅读