缩短回溯算法的时间

时间:2018-05-22 15:09:20

标签: algorithm backtracking

我正在尝试使用回溯来解决问题。考虑到n * n数组(arr)的出现,我必须使用回溯,并且n <= 20。 我应该在没有按下所有按钮的情况下制作一个给定的形状。我可能有多个答案,但是我应该按照按钮的最小次数打印答案。

按下按钮可更改按下按钮以及上,下,左,右按钮的状态。 #未按下按钮,按下按钮

例如,
4
O O O O.
O O O O.
O O O O.
O O O O.
作为输入


#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)的所有情况的数量来解决这个问题。

我解决了这个问题

1 个答案:

答案 0 :(得分:1)

  

有没有办法减少花费的时间?

在更好的电脑上运行它?只是在开玩笑^^。

看来你是一名学生,它看起来像是一个家庭作业,所以我只是提供一些提示和引线。

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