Jump to content

Help : BackTracking in a maze

- - - - -

  • Please log in to reply
1 reply to this topic

#1
MahdiAlQaffas

MahdiAlQaffas

    Newbie

  • Members
  • Pip
  • 3 posts
Hello every body

I'm creating a program that generates a random maze depending on the starting point you enter and then solves it. My problem is that even thought there is a solution to the maze, it returns that there is no solution.

I tried to do BackTracking in the getMove() method but it didn't work

this is my code

// Lab29ast.java



import java.io.*;

import java.util.*;

import java.util.ArrayList;


public class lab29a

{

	public static void main(String args[]) throws IOException

	{

		System.out.println("\nLab 29a \n");

		BufferedReader input = new BufferedReader(new InputStreamReader(System.in));

		System.out.print("Enter random starting seed  ===>>  ");

		int seed = Integer.parseInt(input.readLine());


		Maze maze = new Maze(seed);

		maze.displayMaze();

	        maze.solveMaze();

		maze.displayMaze();

		maze.mazeSolution();

	}

}


class Coord  	// Coord is a class that stores a single maze location.

{

	private int rPos;

	private int cPos;

	public Coord (int r, int c) 		{ rPos = r; cPos = c; }

	public boolean isFree() 		{ return (rPos == 0 && cPos == 0); }

	public void setPos(int r, int c) 	{ rPos+= r; cPos+= c; }

        public int getrPos() 	                { return  rPos;   }

        public int getcPos() 	                { return  cPos;   }

}


class Maze

{

	private char mat[][];			// 2d character array that stores the maze display

	private Coord currentMove;		// object that stores current maze position

	private MyStack visitStack;		// stack that stores location that have been visited


	// constructor which generates the random maze, random starting location

	// and initializes Maze class values.  If the random value equals 0 the maze

	// store an 'X' otherwise it store an 'O' in the maze.

	public Maze(int seed)

	{

		Random random = new Random(seed);

		int startRow, startCol;

		mat = new char[12][12];

		for (int r = 0; r < 12; r++)

			for (int c = 0; c < 12; c++)

			{

				if (r == 0 || c == 0 || r == 11 || c == 11)

					mat[r][c] = 'X';

				else

				{

					int rndInt = random.nextInt(2);

					if (rndInt == 0)

						mat[r][c] = 'X';

					else

						mat[r][c] = 'O';

				}

			}

		mat[0][0] = 'O';

		startRow = random.nextInt(12);

		startCol = 11;

		mat[startRow][startCol] = '.';

		visitStack = new  MyStack();

		currentMove = new Coord(startRow,startCol);

		visitStack.push(currentMove);

	}


	// displays the current maze configuration

	void displayMaze() throws IOException

	{

		System.out.println("\nRANDOM MAZE DISPLAY\n");

		for (int r = 0; r < 12; r++)

		{

			for (int c = 0; c < 12; c++)

				System.out.print(mat[r][c] + "  ");

			System.out.println();

		}

		System.out.println();

		pause();

	}


	// This method solves the maze with private helper method <getMove>.

	// A loop is needed to repeat getting new moves until either a maze solution

	// is found or it is determined that there is no way out off the maze.

	public void solveMaze() throws IOException

	{

		System.out.println("\n>>>>>   WORKING  ....  SOLVING MAZE   <<<<<\n");


		while(getMove())

		{

			mat[currentMove.getrPos()][currentMove.getcPos()] = '.';

			//System.out.println("1");

			visitStack.push(currentMove);

			//System.out.println("2");


		}

	}


	// Short method to display the result of the maze solution

	public void mazeSolution()

	{

		if (currentMove.isFree())

			System.out.println("\nTHE MAZE HAS A SOLUTION.\n");

		else

			System.out.println("\nTHE MAZE HAS NO SOLUTION.\n");

	}


	// This method determines if a coordinate position is inbounds or not

	private boolean inBounds(int r, int c)

	{

		boolean inBound = false;


		if(r >= 0 && c >= 0)

		{

			if((r + 1 ) < mat.length && (c + 1) < mat[0].length)

				inBound = true;

		}


		return inBound;

	}


   	// This method checks eight possible positions in a counter-clock wise manner

	// starting with the (-1,0) position.  If a position is found the method returns

	// true and the currentMove coordinates are altered to the new position

	private boolean getMove() throws IOException

	{

		boolean canmove = false;

		int tempRow = currentMove.getrPos();

		int tempCol = currentMove.getcPos();


		if(inBounds((currentMove.getrPos() - 1), (currentMove.getcPos() + 0)) == true)

		{

			if(mat[currentMove.getrPos() - 1][currentMove.getcPos() + 0] == 'O')

			{

				canmove = true;


				tempRow = currentMove.getrPos() - 1;

				tempCol = currentMove.getcPos() + 0;

			}

		}


		else if(inBounds((currentMove.getrPos() -1), (currentMove.getcPos() +1)) == true)

		{

			if(mat[currentMove.getrPos() - 1][currentMove.getcPos() + 1] == 'O')

			{

				canmove = true;


				tempRow = currentMove.getrPos() - 1;

				tempCol = currentMove.getcPos() + 1;

			}

		}


		else if(inBounds((currentMove.getrPos() + 0), (currentMove.getcPos() + 1)) == true)

		{

			if(mat[currentMove.getrPos() + 0][currentMove.getcPos() + 1] == 'O')

			{

				canmove = true;


				tempRow = currentMove.getrPos() + 0;

				tempCol = currentMove.getcPos() + 1;

			}

		}


		else if(inBounds((currentMove.getrPos() + 1), (currentMove.getcPos() + 1)) == true)

		{

			if(mat[currentMove.getrPos() + 1][currentMove.getcPos() + 1] == 'O')

			{

				canmove = true;


				tempRow = currentMove.getrPos() + 1;

				tempCol = currentMove.getcPos() + 1;

			}

		}


		else if(inBounds((currentMove.getrPos() + 1), (currentMove.getcPos() + 0)) == true)

		{

			if(mat[currentMove.getrPos() + 1][currentMove.getcPos() + 0] == 'O')

			{

				canmove = true;


				tempRow = currentMove.getrPos() + 1;

				tempCol = currentMove.getcPos() + 0;

			}

		}


		else if(inBounds((currentMove.getrPos() + 1), (currentMove.getcPos() - 1)) == true)

		{

			if(mat[currentMove.getrPos() + 1][currentMove.getcPos() - 1] == 'O')

			{

				canmove = true;


				tempRow = currentMove.getrPos() + 1;

				tempCol = currentMove.getcPos() - 1;

			}

		}


		else if(inBounds((currentMove.getrPos() + 0), (currentMove.getcPos() - 1)) == true)

		{

			if(mat[currentMove.getrPos() + 0][currentMove.getcPos() - 1] == 'O')

			{

				canmove = true;


				tempRow = currentMove.getrPos() + 0;

				tempCol = currentMove.getcPos() - 1;

			}

		}


		else if(inBounds((currentMove.getrPos() - 1), (currentMove.getcPos() - 1)) == true)

		{

			if(mat[currentMove.getrPos() - 1][currentMove.getcPos() - 1] == 'O')

			{

				canmove = true;


				tempRow = currentMove.getrPos() - 1;

				tempCol = currentMove.getcPos() - 1;

			}

		}


		if(canmove == true)                                //BackTracking

		{

			currentMove = new Coord(tempRow, tempCol);

			//System.out.println(currentMove + " push");

		}

		else

		{

			currentMove = (Coord)visitStack.pop();

		    //System.out.println(currentMove + " pop");

		}


//		if(visitStack.isEmpty())

//			canmove = false;

//		else

//			canmove = true;


		return canmove;

	}


	private void pause() throws IOException

	{

		BufferedReader input = new BufferedReader(new InputStreamReader(System.in));

		String dummy;

		System.out.print("\nPress <Enter> to continue  ===>>  ");

		dummy = input.readLine();

	}

}


class MyStack<E>

{

	private ArrayList<E> data;	// stores stack data


	public MyStack()

	// Initializes an empty array object 

	{

		data = new ArrayList<E>();

	}


	public boolean isEmpty()

	// Returns true if data is empty, false otherwise

	{

		return data.size() == 0;

	}


	public void push (E x)

	// Adds variable x to the top of the stack

	{

		 data.add(x);

	}


	public E pop()

	// Returns and removes the top element from the stack

	{

		if(!data.isEmpty())

			return data.remove((data.size())-1);


		System.out.println("stack empty ...  fool!");


		return null;

	}


	public E peek()

	// Returns the top element from the stack without removal

	{

		return (E)data.get((data.size())-1);

	}

}



this is my output

X - SOLID WALL (no passage allowed)

O - PATH (passage allowed)

. - TRAVELED (path traveled to find the exit)

Enter random starting seed  ===>>  25


RANDOM MAZE DISPLAY


O  X  X  X  X  X  X  X  X  X  X  X

X  O  O  X  O  O  X  X  X  X  X  X

X  O  O  X  O  X  O  X  O  O  O  X

X  X  X  O  O  X  X  O  O  O  X  X

X  X  X  X  O  O  O  O  O  X  O  X

X  X  X  X  O  O  O  X  X  X  X  X

X  O  X  O  X  X  O  X  O  X  O  X

X  X  X  X  X  O  O  X  X  X  O  X

X  X  X  O  O  X  X  O  O  X  O  X

X  O  X  X  O  O  O  X  O  O  O  X

X  X  X  X  X  O  O  X  O  X  O  .

X  X  X  X  X  X  X  X  X  X  X  X



Press <Enter> to continue  ===>>


>>>>>   WORKING  ....  SOLVING MAZE   <<<<<



RANDOM MAZE DISPLAY


O  X  X  X  X  X  X  X  X  X  X  X

X  O  O  X  O  O  X  X  X  X  X  X

X  O  O  X  O  X  O  X  O  O  O  X

X  X  X  O  O  X  X  O  O  O  X  X

X  X  X  X  O  O  O  O  O  X  O  X

X  X  X  X  O  O  O  X  X  X  X  X

X  O  X  O  X  X  O  X  O  X  .  X

X  X  X  X  X  O  O  X  X  X  .  X

X  X  X  O  O  X  X  O  O  X  .  X

X  O  X  X  O  O  O  X  O  O  .  X

X  X  X  X  X  O  O  X  O  X  .  .

X  X  X  X  X  X  X  X  X  X  X  X



Press <Enter> to continue  ===>>


THE MAZE HAS NO SOLUTION.


Press any key to continue...

this is what should the output be

Enter random starting seed ===>> 25


RANDOM MAZE DISPLAY


O X X X X X X X X X X X

X O O X O O X X X X X X

X O O X O X O X O O O X

X X X O O X X O O O X X

X X X X O O O O O X O X

X X X X O O O X X X X X

X O X O X X O X O X O X

X X X X X O O X X X O X

X X X O O X X O O X O X

X O X X O O O X O O O X

X X X X X O O X O X O .

X X X X X X X X X X X X


Press <Enter> to continue ===>>


>>>>> WORKING .... SOLVING MAZE <<<<<


RANDOM MAZE DISPLAY


. X X X X X X X X X X X

X . . X . . X X X X X X

X . . X . X . X . . . X

X X X . . X X . . . X X

X X X X . . . . . X . X

X X X X . . . X X X X X

X O X O X X . X O X . X

X X X X X . O X X X . X

X X X O . X X . . X . X

X O X X . . . X . . . X

X X X X X . . X . X . .

X X X X X X X X X X X X


Press <Enter> to continue ===>>


THE MAZE HAS A SOLUTION.

please help me for I need to know how to fix the program very quickly

I would appreciate any answer or comment

thank you in advance

#2
Norm

Norm

    Programming Professional

  • Members
  • PipPipPipPipPip
  • 327 posts
How have you tried debugging your code? If you don't have an interactive debugger than try using println statements to show the values of all the variables as the code executes and to show the execution flow.

For easier testing while debugging, I suggest that you use a smaller maze that you easily see the path and that won't generate too much printed output.




1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users