Java:使用 Java 的递归迷宫代码错误

Java: Error in code for a Recursive Maze for using Java

下面的代码是通过递归的迷宫,应该可以解决迷宫问题。它读取三个不同的 txt 文件,S 是开始,G 是目标,X 是屏障,O 是自由 space

GOOOOXO //maze1
XXOXOOX
OXOOOXX
XXXOOXO
XXXXOXX
SOOOOOX
XXXXXXX

XOOOOXO //maze2
XXOXOOG
OXOOOXX
XXXOOOX
XXXXOXX
SOOOOOX
XXXXXXX

XOOOOXO //maze3
XXOXOXG
OXOOOXX
XXXOOOX
XXXXOXX
SOOOOOX
XXXXXXX

这些是迷宫。 maze1 和 maze2 有一个解决方案,但每次我 运行 它,它 returns "unsolvable"。我不确定错误在哪里。这是完整的代码:

import java.util.ArrayList;
import java.util.Scanner;
import java.io.File;
import java.io.IOException;
public class Maze2
{
 private static char[][] maze;
 private static int startrow, startcol, finishrow, finishcol;
 private static ArrayList<String> mazeBuffer;
 public static void initializeMaze(String fileName)
 {
  startrow = startcol = finishrow = finishcol = -1;
  mazeBuffer = new ArrayList<String>();
  int numcols = 0;
  try
  {
   Scanner file = new Scanner(new File(fileName));
   while(file.hasNext())
   {    
    String nextLine = file.nextLine();
    mazeBuffer.add(nextLine);
    if (nextLine.length() > numcols)
     numcols = nextLine.length();
   }
  }
  catch(Exception e)
  {
   System.out.println(fileName + " has an issue");
  }
  int numrows = mazeBuffer.size();
  maze = new char[numrows][numcols];
  for (int r = 0; r < numrows; r ++)
  {
   String row = mazeBuffer.get(r);
   for (int c = 0; c < numcols; c++)
   {
    if(row.length() >= c)
     maze[r][c]=row.charAt(c);
    else
     maze[r][c]='*';
    if (maze[r][c] == 'S')
    {
     startrow = r;
     startcol = c;
    }
    if (maze[r][c] == 'G')
    {
     finishrow = r;
     finishcol = c;
    }
   }
  }
  System.out.println("Maze loaded");
 }
 public static void printMaze()
 {
  for (char[] row: maze)
  {
   for (char c: row)
    System.out.print(c);
   System.out.println();
  }
  System.out.println();
 }
 public static void main (String[] args)
 {
  initializeMaze("maze3.txt");
  printMaze();
  if (solveMaze(startrow, startcol))
   printMaze();
  else
   System.out.println("Unsolvable.");
 } 
public static boolean solveMaze(int r, int c)
{
  if(r < 0 || c < 0 || r >= maze.length || c >= maze[0].length)
    return false;  
  if(maze[r][c]=='G')
    return true;
  if (maze[r][c] != '0'|| maze[r][c] != 'S')
    return false; 
 maze[r][c]='A';
 if(solveMaze(r-1,c))
 {
   maze[r][c]= '#';
   return true;
 }
  if(solveMaze(r+1,c))
 {
   maze[r][c]='#';
   return true;
 }
   if(solveMaze(r,c-1))
 {
   maze[r][c]='#';
   return true;
 }
   if(solveMaze(r,c+1))
 {
   maze[r][c]='#';
   return true;
 }
  else{
  return false;
    }
   }
}

如果一切正确,迷宫 1 和 2 应该是可以解决的,但由于某些原因目前还不能解决。请帮助它是一个即将到期的项目,我无法弄清楚。

问题出在你是否在有效路径上的条件上。 第一个错误是,您正在检查数字 0 而不是大写字母 O。 第二个错误是两个条件的组合。如果您从 'S' 开始,您显然不是 'O'。所以你的情况告诉你,你不在一条有效的道路上。检查应该是: 如果(!(迷宫[r][c] == 'O'|| 迷宫[r][c] == 'S'))

如果你解决了这个问题,一切都应该正常工作。