- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我一直在编写程序来解决各种数字难题,但我一直在设计无法优化的不合理复杂的搜索算法。
例如,在一个谜题中,给你一个 3x3 的网格,下面是数字 1 到 9:
123
456
789
您可以沿任何方向循环任何行或列中的数字。下面是将数字的顶行 移到右边 的示例。如果数字位于网格的边缘,它们将循环。
123 -> 312
456 456
789 789
您必须以这种方式移动数字,直到您创建一个幻方,其中每列、每行和对角线上的数字总和为 15。
我已经编写了一个 DFS 蛮力算法来测试所有可能的移动序列,尽管每个回合可用移动的数量呈指数增长(大约 12 ^ [当前回合]),使其变得无用。
BFS 似乎是找到正确着法的最佳选择,但这需要我存储数百甚至数千个网格副本以便回溯!
我经常遇到这类问题。 BFS 和 DFS 算法分别使用过多的内存和时间。我需要帮助优化这些算法,以便它们运行得更快、更高效。也许识别数字的模式和关系或为实现目标提供算法逻辑会有所帮助? (我不知道那会带来什么)。
编辑:
我的固定算法非常有效。学习如何为我的排列编号是必不可少的。谢谢大家!
最佳答案
我建议查找内存(根据输入缓存函数调用的结果,以便不会为相同的后续调用重新计算该函数)。了解内存后,我会查找动态编程(仍然保存函数的结果,但也重新排序计算以消除不必要的调用)。一些动态规划的解释使用斐波那契的递归定义,然后是斐波那契 + 内存,并以计算重新排序结束。
对于一般的 DFS 和 BFS 问题,称为“分支定界”的技术可能很有趣。边界部分可以让你在某些问题上有实质性的收获。修剪比不那么复杂的边界高一级的子树会消除搜索树中的许多新分支(换句话说:由于树随深度呈指数增长,因此尽早修剪搜索很重要)。
对于您的特定问题,我相信优化是可能的。
首先,让我们考虑 DFS。我相信您的电路板的所有排列都可以从电路板的任何配置中获得。作为结果。 DFS 可以在没有回溯的情况下实现(尽管我猜你知道这一点)。深度搜索? (编辑:根据 Daniel Fischer,这是错误的。一半的状态是可到达的,尽管它不会影响无回溯声明,因为回溯不会帮助您达到无法到达的状态)
但是,您可能会发现您不想仅仅为了发现您尚未解决问题而进行许多排列。回溯实际上可能有所帮助。或者……
考虑一下您的最终目标。幻方有一些特殊的属性,您可以利用这些属性来更仔细地选择您的操作。例如,由于行和列的总和必须为 15,因此您知道 9、8 和 7 不能彼此共享一行或一列。 9 和 6 也不能。6 可以与 8 和 1 或 7 和 2 一起使用。6 不能与 5 和 4 共享一列/行,即使它们总和为 15,因为鸽巢原理(每行/列包含 9 、8 或 7)。事实上,您可能会发现您的问题有一个唯一的解决方案,对所有行、所有列、反射和转置中的某种循环排列取模。对角线要求进一步限制了有效解。
旁白:上一段中使用的逻辑与基于约束的编程没有什么不同。它并不是真正的优化技术(尽管如果不是运行时,它可能被认为是对实现时间的优化),但您也可能会感兴趣(另请注意,幻方和数独经常用于说明基于约束的编程) .
现在你有了一个目标:
与搜索各种排列直到问题得到解决相比,这是一种根本不同的方法。我会尝试找到一个动态编程解决方案。对于使用增量操作从起始状态移动到目标状态的稍微简单的动态规划问题,请查看 Levenshtein 编辑距离问题。
关于performance - 拼图编程 - 无法优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8754026/
我在某处遇到了以下难题 #include int main() { { /*Fill in something here to make this code compile
我正在尝试为 iOS 创建一个拼图游戏应用程序。从我在互联网上的搜索来看,确实没有任何关于这个主题的教程。有谁知道任何人都知道的好教程或游戏教程的链接?谢谢。顺便说一下,iOS4 将不胜感激。 最佳答
如果必须使用 Promises,您会如何编写以下代码? 这个想法是,“私有(private)”方法 p1 调用一个执行异步操作的函数,然后,当异步调用的结果准备就绪时,控制权将传递给“私有(priva
下面是其中一个 facebook 谜题:我无法理解如何进行此操作。 你有 C 个容器、B 个黑球和无限数量的白球。您希望以一种方式在容器之间分配球,即每个容器至少包含一个球,并且选择白球的概率大于或等
有 5 位成员围坐在一张 table 旁。关键值是坐在 table 周围的成员数量。所以现在关键值将是 5。一个恐怖分子告诉成员,因为你们是 5 个成员,所以我将从第一个成员开始数,数到 5 的人将被
你能在不抛出错误的情况下解决这个问题吗?答案是单线。这是来自一个死的职位发布,在回复中要求回答。我认为这是剔除受访者的聪明方法,但我似乎无法在不出错的情况下回答它。 显而易见的解决方案: f.moo(
此源输出 G'Day Mate. 这是怎么发生的? public static void main(String args[]) { System.out.println("Hello Wor
我正在 android 中开发一个 slider 拼图,它有一个图像被分解成小图像,我们需要对这些 fragment 进行排序以形成正确的图像。我使用了一个 3x3 的 GridView ,其中包含
我遇到了以下难题,无法在 Picat 中制定解决方案: You will generate 5-digit numbers, where each digit is in 1..5 and diffe
我是 Javascript 新手,并且正在努力解决 CodeWars 中的这个难题。 约翰想用壁纸装饰房间。房间的尺寸为:宽度(w)、高度(h)、长度(l)。一卷壁纸的尺寸为 52cm 宽,10m 长
我对 Java 还很陌生,尝试过 Best Before puzzle from Spotify昨天。当我发送它时,我收到“错误答案”错误。检查其他解决方案没有帮助,我无法弄清楚哪个输入给出了错误的答
我正在尝试恢复我拥有的一些旧代码,这是一个拼图游戏。它从文件夹中加载图像(拼图),将它们随机放置在页面周围,然后拖放到板上。这曾经有效,但当我今天尝试使用它时,它只是抛出错误(见下文)。 HTML:
这对你们来说可能是个愚蠢的问题。它是关于 CSS Sprites 的。我有一个包含 4 个菜单的导航,例如 .. HOME COMPANY SERVICES SUPPORT 尽管我使用了一个 css
我需要创建一个标题,可以根据正在构建的页面轻松添加或删除部分,但我在处理其中一部分时遇到了问题。 我有一个标题,看起来像这样将所有组件放在 如果导航被移除,它应该看起来像这样(垂直居中) 我的问题是如
我在 JS 中构建了一个 15 拼图,但我的随机拼图生成正在创建无法解决的拼图实例。这可能是因为我不是计算机科学专业的负责人,但我不确定如何计算代码排列中的反转次数。我想知道如何编写我的代码,以便我可
我正在寻找 8 Puzzle graphs tree generator,最好是 (php+) html+css+javascript。我需要的是类似 3 2 1 6 8 7 5 4 会生成所有可
我住在德国,在 Android Market 上发布“Last Call Widget”。随着时间的推移,我一直在稳步改进它,但一组用户仍然提示它无法在他们的设备上运行。 我的小部件监听“androi
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我正在尝试制作一个看起来像这样的拼图游戏。我试过的看起来像这样。 https://jsfiddle.net/uccfb46z/ 现在如果我想改变碎片的形状我需要修改这部分 - outside: fu
首先,让我为缺少 SSCCE 表示歉意。我在这方面真的没有足够的专业知识来弄清楚什么是相关的,什么不是。 简而言之,问题是在两台运行相同分辨率 (1366x768) 的不同计算机上,我女朋友的 tum
我是一名优秀的程序员,十分优秀!