Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过检查点找到迷宫的最小路径_Java_Matrix_Maze - Fatal编程技术网

Java 通过检查点找到迷宫的最小路径

Java 通过检查点找到迷宫的最小路径,java,matrix,maze,Java,Matrix,Maze,我试图找到从起点“S”到目标“G”的最小路径,通过所有检查点“@”。 虽然我听说最佳优先搜索是有效的,但我使用了使用队列的广度优先搜索。 我正在为每个点的每个可能路径创建新对象,并将其添加到队列中。 但是,当我在队列的一个对象的某个位置更改值时,它在所有其他对象中的值也会更改(至少我认为正在发生这种情况) 请告诉我哪里出了问题。 我认为“maze1”或“temp.maze2”有问题 对不起,这是一个破烂的密码 class ortry1 { static int w,h; stat

我试图找到从起点“S”到目标“G”的最小路径,通过所有检查点“@”。 虽然我听说最佳优先搜索是有效的,但我使用了使用队列的广度优先搜索。 我正在为每个点的每个可能路径创建新对象,并将其添加到队列中。 但是,当我在队列的一个对象的某个位置更改值时,它在所有其他对象中的值也会更改(至少我认为正在发生这种情况)

请告诉我哪里出了问题。 我认为“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]+"   ");}}

    }

}

您的问题在于
char[][]maze1=temp.maze2
,在方法
populatequeue()
的开头

maze1和temp.maze2现在都指向相同的对象(您复制的是引用,而不是对象),因此当您修改maze1或temp.maze2时,您正在更改相同的对象

如果要创建两个不同的对象,可以使用方法clone()

char[]maze1=temp.maze2.clone()


即使在克隆了“maze2”之后,我也有同样的问题。我甚至尝试在Mazestate的构造函数this.maze2=maze1.clone()中克隆“maze1”;仍然存在相同的问题。@KarthickVinod当您创建一个
状态队列时。添加
,然后再次修改
maze1
,您也在更新添加到队列中的对象,因为您每次都添加了相同的引用。如果在对
populatequeque()
的同一调用中有多个可用路径,则会发生这种情况。你修改了之前添加到queque中的maze1,我明白你的意思了。为了解决这个问题,我添加了
maze1=temp.maze2.clone()
在将每个元素添加到
statequeue
之后。所以现在我想我并没有向队列添加相同的引用。但我仍然有相同的问题。很抱歉重复提出问题。
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;
    }
}