algorithm - 减少回溯算法的时间
问题描述
我正在尝试使用回溯解决问题。考虑到 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)按钮的所有情况来解决这个问题。
我解决了这个问题
解决方案
有没有办法减少所需的时间?
在更好的计算机上运行它?开个玩笑^^。
看来您是学生,而且看起来确实像家庭作业,所以我只是提供一些提示和线索。
- 假设在您回溯的某个时刻,您“知道”(=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
,并且您经常进行比较。您可以直接处理两个数组的“差异”:这意味着您有一个数组来判断哪个值是“正确的”或“错误的”。
推荐阅读
- gradle - Intellij 始终给出未解决的符号
- docker - 在 docker 上运行的 Greenplum 数据库服务消耗大量磁盘空间
- asp.net-mvc - 模型中的 HttpPostedFileBase 生成三个
- swift - 我什么时候应该使用协议来替换静态函数
- ruby-on-rails - 无法从另一个盒子访问托管在本地网络中的服务器
- python - 如何在极坐标 Matplotlib 图上添加楔形扇区
- azure - 无法运行从 BotBuilder 示例部署的机器人
- python - `__new__` 和 `__init__` 在类和对象上
- r - 如何将分隔的空格字符串转换为r中的数据框
- php - 动态谷歌地图