- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我对非 BFS 方式非常满意。
那么假设我可以做的操作是
x - 1
x/3(如果 x%3 == 0)
x/5(如果 x%5 == 0)
我想通过执行这些操作找到编号 Z 的最快方法。
遗憾的是我不知道如何创建这个队列,有什么想法吗?
示例
x = 19;
y = 4;
BFS "level" 0 = 19
BFS "level" 1 = 18 (x-1)
BFS "level" 2 = 17(18 - 1),
6(18 / 3)
BFS "level" 3 = 16(17 - 1),
5(6 - 1),
2(6 / 3) - do not include, since 2 < y
BFS "level" 4 = ..., 4(5 - 1) ,..
Number y found in "level" 4
或
可以这样吗?
while array doesn't contain Y
for int x: array
if x%3 == 0
add x/3 to array
if x%5 == 0
add x/5 to array
add x-1 to array
delete x from array
level++
最佳答案
也许是这样的?
static class Trace {
public int currentValue;
public LinkedList<Integer> path;
public Trace(int val) { currentValue = val; path = new LinkedList<Integer>(); }
}
static void addToQueue(int value, Trace currentTrace, LinkedList<Trace> queue) {
Trace nt = new Trace(value);
nt.path = (LinkedList<Integer>)currentTrace.path.clone();
nt.path.addLast(value);
queue.addLast(nt);
}
static LinkedList<Integer> findPath(int from, int to) throws Exception {
// Safety check
if (from < to) throw new Exception("from < to");
LinkedList<Trace> q = new LinkedList<Trace>();
// Initialize queue with FROM value
Trace t = new Trace(from);
t.path.addLast(from);
q.addLast(t);
// Repeat till we have an answer
while (!q.isEmpty()) {
Trace e = q.getFirst();
q.removeFirst();
int cv = e.currentValue;
// Check if we have a solution
if (cv == to) return e.path;
// Handle steps of -1, /3 and /5
if (cv-1 >= to)
addToQueue(cv-1, e, q);
if (cv%3 == 0 && cv/3 >= to)
addToQueue(cv/3, e, q);
if (cv%5 == 0 && cv/5 >= to)
addToQueue(cv/5, e, q);
}
// This will never execute because of existence of linear path
// of length(levels) FROM - TO
throw new Exception("no path");
}
这个函数有两种返回方式。
一种是当 FROM 小于 TO 时,但这只是一种安全检查。
另一种返回方式是当当前检查的值等于 TO 时。
这个解决方案基于 BFS 总是在一致树上找到最短路径的事实。但是我们不是构建整棵树,而是动态创建树的各个部分。您可以这样想象,您只是在给定时间查看树的一部分并处理它的节点。
你也可以换个角度来看这个问题。
“如何使用 +1 *3 和 *5 操作从 Z 值得出 X 值”
并且代码最简单,也许编译器可以优化它。我将跳过评论,因为它们与上面代码中的类似。
static void addToQueue2(int value, Trace currentTrace, LinkedList<Trace> queue) {
Trace nt = new Trace(value);
nt.path = (LinkedList<Integer>)currentTrace.path.clone();
nt.path.addFirst(value);
queue.addLast(nt);
}
static LinkedList<Integer> findPath2(int from, int to) throws Exception {
if (from < to) throw new Exception("from < to");
LinkedList<Trace> q = new LinkedList<Trace>();
Trace t = new Trace(to);
t.path.addFirst(to);
q.addLast(t);
while (!q.isEmpty()) {
Trace e = q.getFirst();
q.removeFirst();
int cv = e.currentValue;
if (cv == from) return e.path;
if (cv > from) continue;
addToQueue2(cv+1, e, q);
addToQueue2(cv*3, e, q);
addToQueue2(cv*5, e, q);
}
throw new Exception("no path");
}
似乎有一种方法可以更快地完成它,但这不是 BFS,而且我没有支持此代码的证据(它缺乏跟踪和错误检查,但这很容易实现):
static int findPath3(long from, long to) {
int len = 0;
while (from != to) {
if (from % 5 == 0 && from / 5 >= to) {
from /= 5;
} else if (from % 3 == 0 && from / 3 >= to) {
from /= 3;
} else {
from--;
}
len++;
}
return len;
}
关于java - 在 Java 中实现 BFS 以找到从数字 X 到数字 Z 的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33188558/
我有一个无向图,我从中重新绘制了相同的图,但采用树状结构(具有层次)。我知道广度优先搜索 (BFS) 算法的工作原理,但我不确定如何从图 --> 树进行转换。 在这里,在 this Wikipedia
只要我没记错,UCS 和 BFS 是一样的,唯一的区别是它不是扩展最浅的节点,而是扩展路径成本最低的节点。 (也为此使用 PriorityQueue 而不是 Queue)所以我复制了我的 BFS 代码
我知道 Dijkstra 的算法、Floyd-Warshall 算法和 Bellman-Ford 算法,用于查找图中 2 个顶点之间的最便宜路径。 但是当所有边的成本都相同时,最便宜的路径是边数最少的
我正在寻找一个代码来找到有向图中的最短路径 a 。 有什么地方可以找到吗? (可以基于BFS) 最佳答案 使用Erlang Digraph Library和函数 get_short_path/3,它采
这个问题已经有答案了: What is the point of the diamond operator (<>) in Java? (7 个回答) 已关闭 6 年前。 我是java初学者,我有BF
我想修改下面的代码以动态从文件中获取数据并运行 BFS。我尝试过循环,但我坚持如何使用匿名对象动态连接节点。 Node nA=new Node("101"); Node nB=new
我正在尝试实现 BFS 来查找学习某门类(class)之前所需的所有先决条件。我的public List computeAllPrereqs(String courseName)方法是我的代码困惑的地
我正在尝试编写一个程序来查找节点 B 是否属于从节点 A 开始的子树。我用 C 编写了代码,并自行实现了队列机制,因为我使用 BFS 来遍历树。问题是我的代码遇到无限循环,说我的队列已满,甚至没有。
我已经制作了 BFS 算法的并行版本,现在我正在尝试序列化相同的算法以了解加速情况。我的代码是这样的: #include #include #include struct Node {
我尝试根据我的研究在 JAVA 中实现 BFS 算法,但我有点困惑,我不确定我是在检查节点是否是目标,还是在将节点添加到探索列表中适当的地方。代码如下: frontier.add(nodes.getF
请帮助我理解我的代码做错了什么。我试图使用 BFS 获得最短路径来解决问题,但它要么给我 -1 要么 2。它应该给我 6 作为答案。我究竟做错了什么?这就是问题所在: 给定一个棋盘,找到马从给定来源到
我最近在解决一个 bfs 问题,其中每个节点都是数组元素的不同排列。但是我无法想出一个合适的数据结构来跟踪扩展树中的访问节点。通常,节点是不同的字符串,因此我们可以只使用映射将节点标记为已访问,但在上
我有一个文件夹结构中的元素列表: /文件夹/myfile.pdf /folder/subfolder1/myfile.pdf /文件夹/子文件夹2/myfile.pdf /folder/subfold
我已经实现了一个 BFS 算法来检测图中的循环,这是以下代码: void hasCycle(node *root,string start){ if(
真的很难弄清楚如何修复我的代码。我知道显然存在错误,因为它没有运行,但我不确定错误到底是什么,也不确定如何修复它们。任何帮助/见解将不胜感激。谢谢!! struct vertices { in
我在图中有代表城镇的顶点。我试图找到从 A 点到 B 点的最短路径。 我创建了一个图形类。 struct Edge{ string name; vector v; Edge(
所以我正在构建这棵树,它有 1..* 个节点,其中每个节点都有一个列表,该列表本身可以有 1..* 个节点。 树的前三层我可以构建得很好,但如果我不编写所有愚蠢的级别,它就不会发挥更多作用。解决方案当
我正在研究 Perfect Squares - LeetCode Perfect Squares Given a positive integer n, find the least number o
我是图论新手,目前只学过图论中的BFS和Disjoint sets。如果在给定的无向连通图中存在一个循环,我可以使用 BFS 找到它吗?我的意图是打印循环中的所有顶点。提前致谢。 最佳答案 是的,如果
我在矩阵上实现 bfs 时遇到问题。似乎我的代码只检查起始节点的子节点。 我的目标是找到从“B”到“H”的最短路径。我还认为我的代码需要大量修改。先感谢您! #include #include #
我是一名优秀的程序员,十分优秀!