- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试找到从起点“S”到目标“G”通过所有检查点“@”的最小路径。虽然我听说最佳优先搜索很有效,但我使用了使用队列的广度优先搜索。我正在为每个点的每个可能路径创建新的 Mazestate 对象并将其添加到队列中。但是,当我更改队列中一个对象中某个位置的值时,所有其他对象中的值也会更改(至少这是我认为正在发生的情况)。
请告诉我哪里出错了。我认为“maze1”或“temp.maze2”有问题
抱歉,代码很破旧。
class ortry1
{
static int w,h;
static int sx,sy,gx,gy;
static int anos=0;
public static char[][] maze3=null;
static boolean goalfound=false;
static Queue<Mazestate> statequeue=new LinkedList<>();
public static void main(String[] args) throws IOException
{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
Scanner scan=new Scanner(System.in);
w=(int)scan.nextInt();
h=(int)scan.nextInt();
maze3=new char[h][w];
String tempo=null;
for(int i=0;i<h;i++)
{
tempo=br.readLine();
maze3[i]=tempo.toCharArray();
if(tempo.indexOf('S')!=-1)
{
sx=i;sy=tempo.indexOf('S');
}
if(tempo.indexOf('G')!=-1)
{
gx=i;gy=tempo.indexOf('G');
}
for(int k=0;k<w;k++)
{
if(maze3[i][k]=='@')
{
anos++;
}
}
}
statequeue.add(new Mazestate(maze3,sx, sy, 0, 0));
ortry1 o=new ortry1();
while(!goalfound)
{
o.populatequeue();
}
}
private void populatequeue()
{
if (statequeue.peek()!=null)
{
Mazestate temp=statequeue.poll();
char[][] maze1=temp.maze2.clone();
int curx=temp.curx;
int cury=temp.cury;
int atscrossed=temp.atscrossed;
int stepcount=temp.stepcount;
System.out.println(atscrossed+" "+stepcount);
if(maze1[curx][cury]=='.'){maze1[curx][cury]='1';}
else if(maze1[curx][cury]=='1'){maze1[curx][cury]='2';}
else if(maze1[curx][cury]=='2'){maze1[curx][cury]='3';}
else if(maze1[curx][cury]=='3'){maze1[curx][cury]='4';}
else if(maze1[curx][cury]=='@'){maze1[curx][cury]='1';}
else if(maze1[curx][cury]=='S'){maze1[curx][cury]='1';}
for(int y=0;y<h;y++){System.out.println();
for(int z=0;z<w;z++)
{System.out.print(maze1[y][z]+" ");}}
//------------UP[curx-1][cury]--------------
if(((curx-1)>=0)&&(maze1[curx-1][cury]!='#')&&(maze1[curx-1][cury]!='4'))
{
System.out.print("up ");
if((maze1[curx-1][cury]=='G'))
{
System.out.println("inG");
if(atscrossed==ortry1.anos)
{
goalfound=true;
System.out.println("===="+(stepcount+1));
}else
{
statequeue.add(new Mazestate(maze1,curx-1, cury, atscrossed, stepcount+1));
}
}else if(maze1[curx-1][cury]=='@')
{
System.out.print("in@");
statequeue.add(new Mazestate(maze1,curx-1, cury, atscrossed+1, stepcount+1));
}else if(maze1[curx-1][cury]=='.')
{
System.out.println("in.");
statequeue.add(new Mazestate(maze1,curx-1, cury, atscrossed, stepcount+1));
}else if(maze1[curx-1][cury]=='1')
{
System.out.println("in1");
statequeue.add(new Mazestate(maze1,curx-1, cury, atscrossed, stepcount+1));
}else if(maze1[curx-1][cury]=='2')
{
System.out.println("in2");
statequeue.add(new Mazestate(maze1,curx-1, cury, atscrossed, stepcount+1));
}else if(maze1[curx-1][cury]=='3')
{
System.out.println("in3");
statequeue.add(new Mazestate(maze1,curx-1, cury, atscrossed, stepcount+1));
}
maze1=temp.maze2.clone();
}
//-----------DOWN[curx+1][cury]------------
if(((curx+1)<ortry1.h)&&(maze1[curx+1][cury]!='#')&&(maze1[curx+1][cury]!='4'))
{
System.out.print("down ");
if((maze1[curx+1][cury]=='G'))
{
System.out.println("inG");
if(atscrossed==ortry1.anos)
{
goalfound=true;
System.out.println("===="+(stepcount+1));
}else
{
statequeue.add(new Mazestate(maze1,curx+1, cury, atscrossed, stepcount+1));
}
}else if(maze1[curx+1][cury]=='@')
{
System.out.println("in@");
statequeue.add(new Mazestate(maze1,curx+1, cury, atscrossed+1, stepcount+1));
}else if(maze1[curx+1][cury]=='.')
{
System.out.println("in.");
statequeue.add(new Mazestate(maze1,curx+1, cury, atscrossed, stepcount+1));
}
else if(maze1[curx+1][cury]=='1')
{
System.out.println("in1");
statequeue.add(new Mazestate(maze1,curx+1, cury, atscrossed, stepcount+1));
}else if(maze1[curx+1][cury]=='2')
{
System.out.println("in2");
statequeue.add(new Mazestate(maze1,curx+1, cury, atscrossed, stepcount+1));
}else if(maze1[curx+1][cury]=='3')
{
System.out.println("in3");
statequeue.add(new Mazestate(maze1,curx+1, cury, atscrossed, stepcount+1));
}
maze1=temp.maze2.clone();
}
//------------LEFT[curx][cury-1]-----------------
if(((cury-1)>=0)&&(maze1[curx][cury-1]!='#')&&(maze1[curx][cury-1]!='4'))
{
System.out.print("left ");
if((maze1[curx][cury-1]=='G'))
{
System.out.println("inG");
if(atscrossed==ortry1.anos)
{
goalfound=true;
System.out.println("===="+(stepcount+1));
}else
{
statequeue.add(new Mazestate(maze1,curx, cury-1, atscrossed, stepcount+1));
}
}else if(maze1[curx][cury-1]=='@')
{
System.out.println("in@");
statequeue.add(new Mazestate(maze1,curx, cury-1, atscrossed+1, stepcount+1));
}else if(maze1[curx][cury-1]=='.')
{
System.out.println("in.");
statequeue.add(new Mazestate(maze1,curx, cury-1, atscrossed, stepcount+1));
}
else if(maze1[curx][cury-1]=='1')
{
System.out.println("in1");
statequeue.add(new Mazestate(maze1,curx, cury-1, atscrossed, stepcount+1));
}else if(maze1[curx][cury-1]=='2')
{
System.out.println("in2");
statequeue.add(new Mazestate(maze1,curx, cury-1, atscrossed, stepcount+1));
}else if(maze1[curx][cury-1]=='3')
{
System.out.println("in3");
statequeue.add(new Mazestate(maze1,curx, cury-1, atscrossed, stepcount+1));
}
maze1=temp.maze2.clone();
}
//------------RIGHT[curx][cury+1]---------------
if(((cury+1)<ortry1.w)&&(maze1[curx][cury+1]!='#')&&(maze1[curx][cury+1]!='4'))
{
System.out.print("right ");
if((maze1[curx][cury+1]=='G'))
{
System.out.println("inG");
if(atscrossed==ortry1.anos)
{
goalfound=true;
System.out.println("===="+(stepcount+1));
}else
{
statequeue.add(new Mazestate(maze1,curx, cury+1, atscrossed, stepcount+1));
}
}else if(maze1[curx][cury+1]=='@')
{
System.out.println("in@");
statequeue.add(new Mazestate(maze1,curx, cury+1, atscrossed+1, stepcount+1));
}else if(maze1[curx][cury+1]=='.')
{
System.out.println("in.");
statequeue.add(new Mazestate(maze1,curx, cury+1, atscrossed, stepcount+1));
}
else if(maze1[curx][cury+1]=='1')
{
System.out.println("in1");
statequeue.add(new Mazestate(maze1,curx, cury+1, atscrossed, stepcount+1));
}else if(maze1[curx][cury+1]=='2')
{
System.out.println("in2");
statequeue.add(new Mazestate(maze1,curx, cury+1, atscrossed, stepcount+1));
}else if(maze1[curx][cury+1]=='3')
{
System.out.println("in3");
statequeue.add(new Mazestate(maze1,curx, cury+1, atscrossed, stepcount+1));
}
maze1=temp.maze2.clone();
}
for(int y=0;y<h;y++){System.out.println();
for(int z=0;z<w;z++)
{System.out.print(maze1[y][z]+" ");}}
}
}
}
class Mazestate
{
char[][] maze2=null;
int curx,cury;//current position
int atscrossed;//no. of @ crossed
int stepcount;//no. of steps taken;
public Mazestate(char[][] maze1,int curx,int cury,int atscrossed,int stepcount)
{
this.maze2=maze1.clone();
this.curx=curx;
this.cury=cury;
this.atscrossed=atscrossed;
this.stepcount=stepcount;
}
}
最佳答案
您的问题出在char[][] maze1=temp.maze2;
,位于方法populatequeue()
的开头。
maze1 和 temp.maze2 现在都指向同一对象(您正在复制引用,而不是对象),因此当您修改 maze1 或 temp.maze2 时,您正在更改同一对象。
如果你想创建两个不同的对象,你可以使用方法clone()。
char[][] maze1 = temp.maze2.clone();
关于java - 通过检查点找到穿过迷宫的最小路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25505165/
假设您已经用 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 制作这款游戏
我是一名优秀的程序员,十分优秀!