- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
假设有一个由 1 和 0 组成的二维网格,例如 -
0 1 0 0
0 0 1 0
0 0 0 1
1 0 0 0
网格被“折叠”以形成一个少 1 行和 1 列的较小网格,因此上面的示例将“折叠”以形成 3 行 3 列的网格。
新值由以下规则确定 -
new_grid[i][j] is dependent on
i) old_grid[i][j],
ii) old_grid[i][j+1],
iii) old_grid[i+1][j]
iv) old_grid[i+1][j+1]
If exactly one of the above values are 1, then new_grid[i][j] will be 1, else 0.
因此对于示例网格,在 [0][0]、[0][1]、[1][0] 和 [1][1]
中,只有 [0][1]
为 1
,因此新网格中的 [0][0]
将为 1。同样,[ 0][1]、[0][2]、[1][1] 和 [1][2]
,[0][1] 和 [1][2]
code> 为 1
,因此 new_grid
中的 [0][1]
将为 0。
输入以 new_grid
值的形式给出。我必须找出 old_grid
的可能配置数量,以便通过提供的折叠规则可以实现 new_grid
。
我的方法
我目前想到的回溯方案是这样的——
为旧网格中的每个 1 值单元格确定假想的 2X2 框,这些框将对应于新网格中的适当单元格。
所有这些框都只包含一个值为 1 的单元格,因此将 1 放入每个框中的随机单元格中。
递归检查在随机单元格中放入 1 是否确保每个框仍然恰好保留一个值为 1 的单元格。
如果最终获得了一个网格配置,其中每个框只包含一个值为 1 的单元格,请检查配置是否可以“折叠”以获得新网格。
如果不是,则使用值为 1 的不同单元格重复该过程。
如果旧网格中有一些单元格不属于任何“框”,那么它们就是我所说的“无关紧要”的单元格。
例如-
1 1
0 0
对于上面的new_grid
,old_grid
可以是-
1 0 1
0 0 0
0 0 0
或
1 0 1
0 0 0
1 1 1
最后一行的单元格是“无关紧要”的单元格,因为它们不在任何 2X2 框下并且它们都可以是 1
或 0
成为有效的配置(我认为这是我们可以灵活操作它们的程度,尽管我不确定)。
我的问题是 - 该算法很可能呈指数增长,并且它会花费很多时间来处理比方说 50X10
的网格。
请问还有其他方法可以解决这个问题吗?或者是否有任何聪明的算法可以不遍历所有可能的配置来计算它们?
最佳答案
嗯,所以我想到了一个像这样的 2x3 newGrid:
newGrid: 0 1 0
0 0 0
需要由这些 3x4 oldGrids 中的任何一个生成:
每个_
可以是1
或0
oldGrid 1: _ 0 1 _
_ 0 0 _
_ _ _ _
oldGrid 2: _ 1 0 _
_ 0 0 _
_ _ _ _
oldGrid 3: _ 0 0 _
_ 1 0 _
_ _ _ _
oldGrid 4: _ 0 0 _
_ 0 1 _
_ _ _ _
剩下的所有 8 个点都可以用 2^8 种方式填充。所以答案是 4 * 2^8
但是,想象一下如果 newGrid 有多个 1:
newGrid: 1 1 0
0 0 0
其中将有这 8 个 oldGrids:
oldGrid 1: 1 0 _ _
0 0 _ _
_ _ _ _
oldGrid 2: 0 1 _ _
0 0 _ _
_ _ _ _
oldGrid 3: 0 0 _ _
1 0 _ _
_ _ _ _
oldGrid 4: 0 0 _ _
0 1 _ _
_ _ _ _
oldGrid 5: _ 1 0 _
_ 0 0 _
_ _ _ _
oldGrid 6: _ 0 1 _
_ 0 0 _
_ _ _ _
oldGrid 7: _ 0 0 _
_ 1 0 _
_ _ _ _
oldGrid 8: _ 0 0 _
_ 0 1 _
_ _ _ _
从 oldGrid 1
我会产生 2^8 种组合。但请注意,其中一些与 oldGrid 6
生成的解决方案相同。是那些看起来像这样的:
oldGrid 1.1: 1 0 1 _
0 0 0 _
_ _ _ _
它有 2^6 个解决方案。
因此 oldGrid 1
有 2^8 - 2^6 种解决方案与 oldGrid 6
不冲突。oldGrid 6
有 2^6 个解决方案,与 oldGrid 1
不冲突。
他们一起有 (2^8 - 2^6) + (2^8 - 2^6) + 2^6 解决方案。
1 和 6、1 和 8、2 和 5、3 和 6、3 和 8、4 和 7 有冲突的解空间,每个都有 2^6。
我认为这意味着解决方案的数量是 8 * 2^8 - 6 * 2^6。
那就是:
numberOfSolutions = numberOf1s * 4 * 2^(oldGridSize-4) - overlappingSolutionsCount
overlappingSolutionsCount = numberOfOverlappingPairs * 2^(oldGridSize-4-overlapAreaSize)
function countOverlappingSolutions(newGrid: an MxN matrix) {
result = 0
oldGridSize = (M+1) * (N+1)
for each pair of 1s in the newGrid:
let manhattanDistance = manhattan distance between the 1s in the pair
let overlapAreaSize = 0
if the 1s are in the same row or column
if manhattanDistance == 1:
overlapSize = 2
else if manhattanDistance == 2
overlapAreaSize = 1
result += 2^(oldGridSize -4 -overlapAreaSize)
return result
}
let newGrid be a MxN matrix
let numberOf1s = number of 1s in newGrid
let oldGridSize = (M+1) * (N+1)
result = numberOf1s * 4 * 2^(oldGridSize - 4) - countOverlappingSolutions(newGrid)
我无法努力编写 python 代码,但我希望解决方案是正确的和/或指明了方向
关于python - 在网格中回溯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43782530/
在我的类里面,我学习了 Prolog 回溯算法和 Rete forprop 算法,但我也被告知 Rete 可用于进行反向传播。 这是如何运作的?它在哪些方面与 Prolog 回溯相似/不同? 例如,这
两个 friend P1 和 P2 向共同的 friend P3 发送相同的消息 M。 然而由于一些网络损坏,P3 一次只能接收一个字符不知道接收到的字符是属于 P1 还是 P2。 此外,P3 可能会
我最近发了几个理解递归和回溯的问题,我觉得我现在得到了一些东西,并尝试编写一个测试,我确实解决了数独问题,但是当我以另一种格式编写代码时,代码卡了一会儿,返回False,说明这个问题无解。 grid
有人可以指导我或解释如何在 LISP 中执行回溯吗?任何示例或链接将不胜感激。我确实尝试过谷歌,但是他们都没有足够简单的例子让我理解。 谢谢 最佳答案 典型的方法是将不可变状态向下传递到调用堆栈,辅助
我正在使用 apache 2.2.14 运行 Backtrack 5 R2 (ubuntu) 的完全库存安装。我尝试运行一个简单的 index.html 文件,其中包含一些 javascript 代码
如何在 Javascript 中获取回溯? 理想的特征: 入口函数名称,或匿名函数的一些有意义的标识符, 每个级别的参数列表, 行号。 这可以用标准的 ECMAScript 完成吗? 如果没有,是否可
本文首发公众号:小码A梦 回溯算法是一种常见的算法,常见用于解决排列组合、排列问题、搜索问题等算法,在一个搜索空间中寻找所有的可能的解。通过向分支不断尝试获取所有的解,然后找到合适的
Python 是否支持为每个异常/引发/断言显示相同的自定义错误消息(无论代码在哪里中断)? 我目前对它的破解使用了一个装饰器。我有一个函数main它显示回溯很好,但我希望它也打印my_var (在函
输入: 3,4,8,7,3 5,S,7,2,3, 8,5,5,8,10 9,3,3,8,7 6,10,3,G,1 目标是找到从起点(S)到目标(G)的最佳路径。 我们可以向上、向下、向左、向右移动。
我想匹配一个包含“json”(出现超过 2 次)且两个“json”之间没有字符串“from”的字符串。 For example(what I want the string match or not)
我正在尝试使用回溯方法找到熄灯游戏的解决方案。我无法理解此过程的算法。我的方法是枚举从 0 到 2n2 - 1 的所有整数,并将每个整数转换为具有 n*n 位的二进制数。然后,将其分成n2个二进制数字
所以我正在阅读这本书《服从测试山羊》,在学习 Python 时我在第六章中遇到了一个问题。它说我应该能够运行我们在本章和前一章中设置的功能测试,没有错误;但是,我不断收到我不知道如何修复的回溯。 Tr
我需要一些关于 Android 日志文件反混淆的帮助。 问题是如果我有这样的异常: ... 10-16 10:03:10.488: E/AndroidRuntime(25723): Cau
我有一个看起来像这样的表: here | there | -------+-------+ {1,1} | {1,1} | {1,1} | {2,1} | {1,1} | {1,2} |
我写了一小段代码,它应该接受一个字符数组并让它看起来像计算机正在输入文本。很简单,对吧?但是当我运行它时,Terminal 告诉我: *** stack smashing detected ***:
Python 中的堆栈跟踪显示文件路径。有什么方法可以让它们显示完全限定的函数名称吗? 例子: class Foo(object): def bar(self): raise
我决定深入学习回溯的概念,我有以下任务: 给定N个投资者,M个城市,N×M个投资者偏好矩阵P(P[i,j]=1,当第i个投资者希望在第j个城市建矿池;P[i, j] = 0 那么他是中立的,当 P[i
设 E - 图 G 中所有边的集合问题是从G中找到顶点的最小子集S,它满足条件:S = E 中每个顶点的所有出边的总和 换句话说:边是街道,我们可以在顶点上放置路灯。如果我们在一个顶点上放置一盏路灯—
我正在尝试做这个我在查找面试问题时遇到的问题。我们被问及将 r 个硬币放置在 n*m 网格上的方法数量,使得每行和每列至少包含一个硬币。 我想到了一个回溯解决方案,按行主要顺序处理网格中的每个单元格,
我使用 DexGuard混淆。我有来自崩溃日志和映射文件的堆栈跟踪。当我运行 retrace.bat 并为其提供堆栈跟踪和映射文件时,输出仍然是混淆格式。 最佳答案 您是否在使用 ProGuard 的
我是一名优秀的程序员,十分优秀!