- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在开发一个用 DFS 解决迷宫的小程序。但似乎算法在找到目标之前就停止得太早了。谁能给我提示我做错了什么?
所以墙是 1,3 是目标,我用 2 标记路径。
代码:
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Stack;
public class Maze {
private final int size;
private final int[][] maze;
Maze(int[][] maze){
this.size = maze.length;
this.maze = maze;
}
private boolean inBounds(int number){
return number >= 0 && number < this.size;
}
/*
* This one has no information where the end point is so it uses DFS to find a path to the
* the end point. The end point must be marked by a 3.
*
* procedure DFS-iterative(G,v):
* let S be a stack
* S.push(v)
* while S is not empty
* v = S.pop()
* if v is not labeled as discovered:
* label v as discovered
* for all edges from v to w in G.adjacentEdges(v) do
* S.push(w)
*
*
*/
public void solve(Node start){
Stack<Node> stack = new Stack<Node>();
HashSet<Node> visited = new HashSet<Node>();
stack.push(start);
while(!stack.isEmpty()){
Node tmp = stack.pop();
this.maze[tmp.getY()][tmp.getX()] = 2;
if(!visited.contains(tmp)){
visited.add(tmp);
for(Node n : this.getAdjacentEdges(tmp))
stack.push(n);
}
}
}
private List<Node> getAdjacentEdges(Node tmp) {
List<Node> neighbours = new ArrayList<Node>();
if(this.inBounds(tmp.getX()+1)){
if(this.maze[tmp.getY()][tmp.getX()+1] != 1){
neighbours.add(new Node(tmp.getX()+1, tmp.getY()));
}
}
if(this.inBounds(tmp.getX()-1)){
if(this.maze[tmp.getY()][tmp.getX()-1] != 1){
neighbours.add(new Node(tmp.getX()-1, tmp.getY()));
}
}
if(this.inBounds(tmp.getY()+1)){
if(this.maze[tmp.getY()+1][tmp.getX()] != 1){
neighbours.add(new Node(tmp.getX(), tmp.getY()+1));
}
}
if(this.inBounds(tmp.getY()-1)){
if(this.maze[tmp.getY()-1][tmp.getX()] != 1){
neighbours.add(new Node(tmp.getX(), tmp.getY()-1));
}
}
return neighbours;
}
public static void main(String args[]){
int [][] maze =
{ {1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,1,0,1,0,1,0,0,0,0,0,1},
{1,0,1,0,0,0,1,0,1,1,1,0,1},
{1,0,0,0,1,1,1,0,0,0,0,0,1},
{1,0,1,0,0,0,0,0,1,1,1,0,1},
{1,0,1,0,1,1,1,0,1,0,0,0,1},
{1,0,1,0,1,0,0,0,1,1,1,0,1},
{1,0,1,0,1,1,1,0,1,0,1,0,1},
{1,0,0,0,0,0,0,0,0,0,1,3,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1}
};
Maze m = new Maze(maze);
m.solve(new Node(1,1));
for(int i = 0; i < maze.length; i++){
for(int j = 0; j < maze[i].length; j++){
System.out.print(" " + maze[i][j] + " ");
}
System.out.println();
}
}
}
节点类:
public class Node {
private int x;
private int y;
Node(int x, int y){
this.x = x;
this.y = y;
}
int getX(){
return this.x;
}
int getY(){
return this.y;
}
@Override
public int hashCode(){
return this.getX()+this.getY()+31;
}
@Override
public boolean equals(Object obj){
if (obj == this) return true;
if (obj == null || obj.getClass() != this.getClass()) return false;
Node tmp = (Node) obj;
return tmp.getX() == this.getX() && this.getY() == tmp.getY();
}
@Override
public String toString(){
return "x: " + this.getX() + " y: " + this.getY();
}
}
最佳答案
您的代码中存在一些错误。我稍微修改了您的代码,现在可以使用了。
一些关键观察结果:
1) 您的 inBounds
方法应用不正确,因为迷宫数组的维度不相等。这就是算法无法到达迷宫中的多个网格的原因。所以我删除了 inBounds
方法,修改了 Maze
构造函数以接受两个维度大小并添加了两个方法:inBoundsY
和 inBoundsX
分别检查每个维度。
2) 我敢肯定,标记路径中每个访问过的网格的想法是不正确的。我添加了名为 prev
的新数组来存储路径中每个网格的前一个网格。然后我更改了您的 solve
方法并添加了 fillPath
方法以将路径中的所有网格填充 2。然后我们可以简单地打印所有迷宫并显示 relust。
新代码如下所示:
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Stack;
public class Maze {
private int[][] maze;
// previous grids array
private Node[][] prev;
private int sizeX;
private int sizeY;
private Node lastNode;
Maze(int[][] maze, int sizeY, int sizeX) {
this.maze = maze;
this.sizeY = sizeY;
this.sizeX = sizeX;
prev = new Node[sizeY][sizeX];
}
private boolean inBoundsX(int number){
return number >= 0 && number < sizeX;
}
private boolean inBoundsY(int number){
return number >= 0 && number < sizeY;
}
public void solve(Node start){
Stack<Node> stack = new Stack<>();
HashSet<Node> visited = new HashSet<>();
stack.push(start);
while(!stack.isEmpty()) {
Node tmp = stack.pop();
visited.add(tmp);
if (maze[tmp.getY()][tmp.getX()] == 3) {
lastNode = tmp;
break;
}
for(Node node : this.getAdjacentEdges(tmp)) {
if (!visited.contains(node)) {
stack.push(node);
prev[node.getY()][node.getX()] = tmp;
}
}
}
}
public void fillPath() {
if (lastNode == null) {
System.out.println("No path in maze");
} else {
// assume, that start point and end point are different
for (;;) {
lastNode = prev[lastNode.getY()][lastNode.getX()];
// There's no previous node for start point, so we can break
if (lastNode == null) {
break;
}
maze[lastNode.getY()][lastNode.getX()] = 2;
}
}
}
private List<Node> getAdjacentEdges(Node tmp) {
List<Node> neighbours = new ArrayList<Node>();
if(this.inBoundsX(tmp.getX()+1)){
if(this.maze[tmp.getY()][tmp.getX()+1] != 1){
neighbours.add(new Node(tmp.getX()+1, tmp.getY()));
}
}
if(this.inBoundsX(tmp.getX()-1)){
if(this.maze[tmp.getY()][tmp.getX()-1] != 1){
neighbours.add(new Node(tmp.getX()-1, tmp.getY()));
}
}
if(this.inBoundsY(tmp.getY()+1)){
if(this.maze[tmp.getY()+1][tmp.getX()] != 1){
neighbours.add(new Node(tmp.getX(), tmp.getY()+1));
}
}
if(this.inBoundsY(tmp.getY()-1)){
if(this.maze[tmp.getY()-1][tmp.getX()] != 1){
neighbours.add(new Node(tmp.getX(), tmp.getY()-1));
}
}
return neighbours;
}
public static void main(String args[]){
int [][] maze =
{ {1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,1,0,1,0,1,0,0,0,0,0,1},
{1,0,1,0,0,0,1,0,1,1,1,0,1},
{1,0,0,0,1,1,1,0,0,0,0,0,1},
{1,0,1,0,0,0,0,0,1,1,1,0,1},
{1,0,1,0,1,1,1,0,1,0,0,0,1},
{1,0,1,0,1,0,0,0,1,1,1,0,1},
{1,0,1,0,1,1,1,0,1,0,1,0,1},
{1,0,0,0,0,0,0,0,0,0,1,3,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1}
};
// Create maze with certain dimensions
Maze m = new Maze(maze, 10, 13);
m.solve(new Node(1,1));
m.fillPath();
for(int i = 0; i < maze.length; i++){
for(int j = 0; j < maze[i].length; j++){
System.out.print(" " + maze[i][j] + " ");
}
System.out.println();
}
}
}
结果将是:
1 1 1 1 1 1 1 1 1 1 1 1 1
1 2 1 0 1 0 1 2 2 2 2 2 1
1 2 1 0 0 0 1 2 1 1 1 2 1
1 2 0 0 1 1 1 2 0 0 0 2 1
1 2 1 2 2 2 2 2 1 1 1 2 1
1 2 1 2 1 1 1 0 1 0 0 2 1
1 2 1 2 1 0 0 0 1 1 1 2 1
1 2 1 2 1 1 1 0 1 0 1 2 1
1 2 2 2 0 0 0 0 0 0 1 3 1
1 1 1 1 1 1 1 1 1 1 1 1 1
关于java - 迷宫路径搜索 DFS java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33847859/
假设您已经用 Python 编写了一个 m x n 矩阵。矩阵之外的值是不可能的。假设你是在矩阵中移动的东西(就像在迷宫中)并且你不能跨越边界。当您在迷宫中移动时,您会不断考虑您的选择,您可以走哪条路
我正在实现随机鼠标算法来探索迷宫。一段时间后,算法陷入无限循环。我调试了一下,它似乎在一条 channel 之间来回卡住了。 请看一下我的算法实现。 这是我的代码:方向是相对于机器人的。 public
我有一个用 java 编写的工作 ascii 迷宫解算器,使用 char 数组,它将正确路径的每个位置设置为前一个位置 + 1。我使用以下代码来从中获取正确路径,但是它仅适用于垂直运动。任何有关此事的
我有一个生成随机迷宫的程序。迷宫中会显示一个红点,并且迷宫中的每个方 block 都会闪烁红点。迷宫中的所有 block 都是 == 1,如果红点穿过该 block ,它就会递增++。红点朝最小数字的
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我创建了一个从文本文件上传的迷宫,该迷宫当前在运行时完全可见且功能正常。但是,我只想将播放的路线显示为可见,因此仅使起始位置和周围的墙壁/地板在开始时可见。有人知道该怎么做吗? 以下是 Board 类
起初我觉得这很容易,但是当我开始做的时候,我不知道如何继续下去了。我的想法是使用面板,然后绘制粗线,但是绘制墙壁并使我的角色不会超出这些墙壁的正确方法是什么?我无法想象我怎么可能做到这一点。这是一个迷
我从一个文件中得到了一个迷宫,我尝试使用一个程序编写一个类Exercise4,该程序将这样的迷宫文件读入二维 boolean 数组。然后在控制台上显示该数组,每一行一行。使用空白符号和 # 符号表示数
如何通过光栅图像数据找到非线性路径?例如,最低成本算法?起点和终点已知,并给出如下: 起点 = (0,0) 终点 = (12,-5) 例如,通过(灰度)光栅图像提取蜿蜒河流的近似路径。 # fake
在我的游戏中,玩家在迷宫中导航。我不知道如何与墙壁进行正确的碰撞检测。停留在某个区域很容易进行碰撞检测: if (x > rightWallX - playerWidth) x = rightWall
基本上,我一直在按照 Java 教程制作一个基本的迷宫游戏,其中我生成一个随机迷宫,并将其保存到文件中,然后使用 Jpanel 将其打印出来,但是在编译时我不断收到此错误。 Exception in
注意:这是 MSVC,C++17 问题。 免责声明:我知道有人尝试过,是的,我试图找到相关的 SO 答案。 我可以编码 UDL , 以实现将数字文字转换为 std::array,在编译时: /
我目前正在开发一个随机迷宫生成器,它将迷宫存储在一个名为 grid 的二维数组中。这将在稍后用于生成一个真正的 3D 迷宫,用户随后可以穿过该迷宫。 在做了一些研究之后,我尝试使用递归除法算法创建这个
题目地址:https://leetcode-cn.com/problems/the-maze-ii/ 题目描述 There is a ball in a maze with empty space
我正在尝试用 python 编写脚本来解决一种具有多个起点和多个终点的迷宫。正确的路径是从起点沿着直线前进。 例如一个有 4 条路径的迷宫: 起初我想使用左手/右手规则,但由于迷宫的特点,它没有太大意
我正在尝试在 opengl 中创建一个简单的 3D 迷宫。我最初的想法是有一个立方体网格,每个立方体的一些面是透明的(用于走廊)。但是,我在想出一种有效执行此操作的方法时遇到了一些麻烦。我不想为我的迷
我的 DFS 算法在解中缺少节点时遇到问题(检查图片)。每次我的算法遇到死胡同时都会发生这种情况:节点从堆栈中弹出并返回,直到找到可用的移动,并且再也不会重新包含在内。有没有一种简单的方法可以在不重新
所以我正在用 Java 构建 pacman 游戏来自学游戏编程。 我有一个基本的游戏窗口,其中绘制了吃 bean Sprite 和幽灵 Sprite ,吃 bean 使用箭头键移动,不会超出窗口的墙壁
我使用的代码只是取自一个示例,它确实为我的场景建了一堵墙: /** This loop builds a wall out of individual bricks. */ public vo
我正在从事一个包含这些条件的学校元素: 只使用 JS、HTML5 和 CSS 制作迷宫。 在 Angular 色周围制作 torch 效果。你不能穿墙照明。 我开始使用 Canvas 制作这款游戏
我是一名优秀的程序员,十分优秀!