Rat in a Maze šŸŽÆ

beginner
13 min

Rat in a Maze šŸŽÆ

Welcome to our comprehensive guide on solving the classic problem of the Rat in a Maze! In this lesson, we'll explore a practical approach to navigating a maze using different algorithms, making it suitable for both beginners and intermediates. Let's dive in!

What is the Rat in a Maze Problem? šŸ“

The Rat in a Maze problem is a pathfinding problem where we aim to find the shortest path from a start cell to a goal cell in a grid-like maze, using a simple agent - a rat. This problem is a great way to understand and practice various algorithms for solving pathfinding problems.

Basic Maze Representation šŸ’”

Our maze will be represented as a 2D array of cells, each of which can be either wall, empty, start, or goal.

python
# Example Maze maze = [ ["wall", "wall", "wall", "wall", "wall", "wall"], ["wall", "empty", "wall", "empty", "empty", "wall"], ["wall", "wall", "empty", "empty", "wall", "wall"], ["wall", "empty", "wall", "goal", "empty", "wall"], ["wall", "empty", "wall", "empty", "empty", "wall"], ["wall", "wall", "wall", "wall", "wall", "wall"] ]

Depth-First Search (DFS) Algorithm šŸ’”

Let's start with a simple algorithm called Depth-First Search (DFS). DFS is a common algorithm used for traversing or searching through graph or tree structures, and it can also be adapted to solve the Rat in a Maze problem.

Understanding DFS šŸ“

DFS explores as far as possible along each path before backtracking, hence the name "depth-first." This allows us to efficiently explore the maze and find a solution.

Implementing DFS šŸ’”

Here's an example of how to implement DFS for solving the Rat in a Maze problem:

python
# Function to perform DFS def dfs(maze, visited, x, y): # Mark the current cell as visited visited[x][y] = True # Check if we've reached the goal if maze[x][y] == 'goal': return True # Check all four directions (up, down, left, right) directions = [(0, -1), (0, 1), (-1, 0), (1, 0)] for dx, dy in directions: new_x, new_y = x + dx, y + dy # If the cell is not out of bounds and not visited yet, recursively explore if 0 <= new_x < len(maze) and 0 <= new_y < len(maze[0]) and not visited[new_x][new_y]: if dfs(maze, visited, new_x, new_y): return True # If no path is found, return False return False

Putting it all together šŸ’”

python
# Function to find the shortest path using DFS def find_path(maze): visited = [[False] * len(maze[0]) for _ in range(len(maze))] start_x, start_y = 0, 0 # Start at the top-left cell if dfs(maze, visited, start_x, start_y): path = [] x, y = start_x, start_y while (x, y) != (len(maze) - 1, len(maze[0]) - 1): # Goal is at the bottom-right cell path.append((x, y)) visited[x][y] = False # Mark the cell as unvisited for the next path construction for dx, dy in directions: if (x + dx, y + dy) == (start_x, start_y): # If the cell is the start cell, continue searching break x += dx y += dy return path[::-1] # Reverse the path for proper direction # Example usage path = find_path(maze) print(path)

Breadth-First Search (BFS) Algorithm šŸ’”

Breadth-First Search (BFS) is another popular algorithm for pathfinding problems. Unlike DFS, BFS explores all nodes at the same depth level before moving on to the next level.

Implementing BFS šŸ’”

Here's an example of how to implement BFS for solving the Rat in a Maze problem:

python
# Function to perform BFS def bfs(maze, visited, queue): while queue: x, y = queue.pop(0) # Mark the current cell as visited visited[x][y] = True # Check if we've reached the goal if maze[x][y] == 'goal': return True # Check all four directions (up, down, left, right) directions = [(0, -1), (0, 1), (-1, 0), (1, 0)] for dx, dy in directions: new_x, new_y = x + dx, y + dy # If the cell is not out of bounds and not visited yet, add it to the queue and mark it as visited if 0 <= new_x < len(maze) and 0 <= new_y < len(maze[0]) and not visited[new_x][new_y]: visited[new_x][new_y] = True queue.append((new_x, new_y)) return False

Putting it all together šŸ’”

python
# Function to find the shortest path using BFS def find_path(maze): visited = [[False] * len(maze[0]) for _ in range(len(maze))] start_x, start_y = 0, 0 # Start at the top-left cell queue = [(start_x, start_y)] if bfs(maze, visited, queue): path = [] x, y = start_x, start_y while (x, y) != (len(maze) - 1, len(maze[0]) - 1): # Goal is at the bottom-right cell path.append((x, y)) for dx, dy in directions: if (x + dx, y + dy) == (start_x, start_y): # If the cell is the start cell, continue searching break x += dx y += dy return path[::-1] # Reverse the path for proper direction # Example usage path = find_path(maze) print(path)

šŸ“ Note:

In complex mazes, it may not be possible to find a solution using either DFS or BFS, as they are both complete algorithms, meaning they will always find a solution if one exists. However, in such cases, you might need to use more advanced algorithms like A* or Dijkstra's Algorithm.

Quiz šŸ’”

Quick Quiz
Question 1 of 1

What is the main difference between DFS and BFS?