我正在尝试使用回溯来解决问题。考虑到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)的所有情况的数量来解决这个问题。
我解决了这个问题
答案 0 :(得分:1)
有没有办法减少花费的时间?
在更好的电脑上运行它?只是在开玩笑^^。
看来你是一名学生,它看起来像是一个家庭作业,所以我只是提供一些提示和引线。
arr
和temarr
之间有35个不同的值。您还知道count - temcount == 3
(如果您想找到更好的解决方案,则只能按2个按钮)。你有多大可能找到更好的解决方案?compare
功能:假设我在桌子上放置了20 * 20 = 4,000张扑克牌。在计算30分钟后,我知道1,800个是“正面朝上”,2,200个是“面朝下”。现在我将3张牌从“面朝上”翻转到“面朝下”,然后我翻转另外两张不同的牌。我是否需要再花30分钟才能获得2个总数?
回到你的案例:每次修改temarr
中的5个值时,是否必须将其所有值重新比较为arr
的值以测试它们是否不同?temarr
,其唯一目的是将其与arr
进行比较,并且您经常进行比较。您可以直接处理两个数组的“差异”:意味着您有一个数组可以告诉哪个值是“正确”还是“错误”。