- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想解决 DFS 算法。它是关于游戏 8-puzzles
或 N x N
拼图。一开始我有两个数组(零代表一个空字段):
int[][] start = {{0,1,2}, {4,5,3}, {7,8,6}};
int[][] target = {{1,2,3}, {1,5,6}, {7,8,0}};
这个数组进入我的通用 DFS 类,它工作正常。我正确地将它用于其他任务。但为了完整起见,这里是我的 DFS 类的 basic
部分:
private static boolean search(State node, State target) {
if (node.equals(target))
return true;
for (State neighbour : node.getNeighbours()) {
if (!visited.contains(neighbour)) {
predMap.put(neighbour,node);
visited.add(neighbour);
if (search(neighbour, target)){
return true;
}
}
}
return false;
}
所以一开始我的 start
数组将作为第一个参数传递,而我的 target
数组作为第二个参数传递。
在我的 State
类中,我想实现 getNeighbours()
方法,它应该返回所有可能的状态。在第一轮是这样的:
First:
|0|1|2|
|4|5|3|
|7|8|6|
Second (rotated zero):
|1|0|2|
|4|5|3|
|7|8|6|
etc...
这是我的问题。你怎么能那样做?它适用于前 4 个操作,但随后出现异常(零或空字段不在异常位置或有两个零)。那里有什么问题?
@Override
public List<State> getNeighbours() {
List<State> neighbours = new LinkedList<>();
// possibles moves...
final int startX = (freeX - 1 < 0) ? freeX : freeX - 1;
final int startY = (freeY - 1 < 0) ? freeY : freeY - 1;
final int endX = (freeX + 1 > N - 1) ? freeX : freeX + 1;
final int endY = (freeY + 1 > N - 1) ? freeY : freeY + 1;
for (int row = startX; row <= endX; row++) {
for (int column = startY; column <= endY; column++) {
int tmp = board[row][column];
board[row][column] = board[freeX][freeY];
board[freeX][freeY] = tmp;
// Just show the table...
System.out.println("=== BEFORE ===");
for (int[] x : board) {
System.out.println(Arrays.toString(x));
}
neighbours.add(new State(board, freeX + row, freeY + column));
board[freeX][freeY] = board[row][column];
board[row][column] = tmp;
// Just show the table...
System.out.println("=== AFTER ===");
for (int[] x : board) {
System.out.println(Arrays.toString(x));
}
}
}
return neighbours;
}
完整代码https://gist.github.com/T0bbes/66d36326aa8878d5961880ce370ba82d
最佳答案
我检查了你的代码,得到那个异常的原因是,board 数组由每个状态共享。您应该对该数组进行深度复制,您可以尝试使用以下代码:
public Board(int[][] board, int x, int y){
if (board[x][y]!=0)
throw new IllegalArgumentException("Field (" +x+","+y+") must be free (0).");
this.board = new int[board.length][board[0].length];
for (int i = 0; i < this.board.length; i++)
for (int j = 0; j < this.board[i].length; j++)
this.board[i][j] = board[i][j];
this.freeX = x;
this.freeY = y;
this.N = board.length;
}
但是你的代码还存在一些问题:
DFS 可能会多次递归并得到 StackOverflow——您应该增加堆栈大小(-Xss100m
对我有用)。增加堆栈大小后,您的代码可以输出解决方案,但需要 197144 步...
确实,如您所见,DFS 仅输出有效解决方案(如果您的代码正确),而不是最佳解决方案。你应该试试 BFS。
关于java - DFS 算法 - 8-Puzzle 或 nXn-Game,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37847234/
以下是来自Interviewstreet的问题我没有从他们的网站上得到任何帮助,所以在这里提问。我对算法/解决方案不感兴趣,但我不理解他们作为第二个输入示例给出的解决方案。任何人都可以帮助我理解问题陈
根据我的理解,创建一个可解决的滑动拼图必须遵循以下规则: A. If the grid width is odd, then the number of inversions in a solvabl
我编写了一系列函数来尝试解决 N 难题/8 难题。 我对自己处理拼图的能力感到非常满意,但在如何迭代和找到最佳路径方面苦苦挣扎。我的技能也不是 OOP,所以功能很简单。 这个想法显然是为了减少 her
我有些摩尔斯电码丢失了字母之间的空格,我的挑战是找出消息中所说的内容。到目前为止,由于可能存在大量的组合,我有点迷失了。 这是关于我收到的消息的所有信息。 输出将为英语 总是会有有意义的翻译 这是示例
如果我知道,变量 a,b,c,d,e 有多少可能的组合: a+b+c+d+e = 500 并且它们都是整数且 >= 0,所以我知道它们是有限的。 最佳答案 @Torlack、@Jason Cohen:
检查 n 的数组是否整数包含 3 个可以形成三角形的数字(即两个数字中任何一个的总和大于第三个)。 显然,这可以在 O(n) 中完成。时间。 (明显的 O(n log n) 解决方案是对数组进行排序,
我有兴趣实现 14-15 puzzle : 我正在创建一个值 0 - 15 按递增顺序排列的数组: S = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13
Closed. This question is off-topic。它当前不接受答案。 想要改善这个问题吗? Update the question,所以它是用于堆栈溢出的on-topic。 已关闭
所以,我对数独游戏的生成做了大量的阅读。据我所知,获得所需难度的数独谜题的标准方法是生成一个谜题,然后对其进行评分,然后重复,直到获得可接受的评分。这可以通过使用一些更复杂的求解模式(XY-wing、
如何混合两个ARGB像素? 例 在这里,A是(带有Alpha的红色),而B是(带有Alpha的蓝色)。 最佳答案 取自获得图像的同一Wikipedia文章: 转换为介于0到255之间的值: rOut
Closed. This question is off-topic。它当前不接受答案。 想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。 已关闭8
Joel 在他的 Guerrilla Guide to Interviewing 中提到计算一个字节中设置位的数量是一个编程问题。 ,并谈到了一种利用查找表中出现的模式的方法。在我发现这种模式后不久,
我在做一些回顾时遇到了这个报告的面试问题(以下引用是我找到的关于这个问题的所有信息): Given a function for a fair coin, write a function for a
我遇到了这个问题:说给定两个权重1和3,您可以权衡1,2(乘以3-1),3,4(乘以3 + 1)(使用平衡的两面)。现在找到最小的砝码数量,以便可以测量1到1000。 答案是1,3,9,27 ...
Locked. This question and its answers are locked因为该问题是题外话,但具有历史意义。它当前不接受新的答案或互动。 我使用这些规则制作了最终的笑声发生器。
左边是布局的正常状态。右边是布局的展开状态。 我的问题是我不知道如何让粉色框在它们的单元格中居中,并且随着布局向任何方向增长,粉色框之间的绿线连接起来。 只有这两个 View 的 AutoSizing
考虑以下代码: template struct S { }; template struct B; template class C> struct B> { void f() { } };
问题: 编写一个程序来删除出现在“所有”字符串中的片段,其中一个片段是 3 个或更多个连续的单词。 示例: 输入: s1 = "正在下雨,我想开车回家。"; s2 = "下雨了,我想去滑雪。"; s3
请检查以下程序。 #include struct st { int a ; } fn () { struct st obj ; obj.a = 10 ; return obj ; } int
我一直在研究这个 Prolog 逻辑问题。它得到了不正确的结果,运行程序本身需要一段时间,这是我更关心的。逻辑问题如下: Alex, Bret, Chris, Derek, Eddie, Fred,
我是一名优秀的程序员,十分优秀!