Skip to main content

Minimum Moves to Move a Box to Their Target Location - Solution & Explanation

Practice this problem

Problem Statement

A storekeeper is a game in which the player pushes boxes around in a warehouse trying to get them to target locations.

The game is represented by an m x n grid of characters grid where each element is a wall, floor, or box.

Your task is to move the box 'B' to the target position 'T' under the following rules:

  • The character 'S' represents the player. The player can move up, down, left, right in grid if it is a floor (empty cell).
  • The character '.' represents the floor which means a free cell to walk.
  • The character '#' represents the wall which means an obstacle (impossible to walk there).
  • There is only one box 'B' and one target cell 'T' in the grid.
  • The box can be moved to an adjacent free cell by standing next to the box and then moving in the direction of the box. This is a push.
  • The player cannot walk through the box.

Return the minimum number of pushes to move the box to the target. If there is no way to reach the target, return -1.

 

Example 1:

Input: grid = [["#","#","#","#","#","#"],
               ["#","T","#","#","#","#"],
               ["#",".",".","B",".","#"],
               ["#",".","#","#",".","#"],
               ["#",".",".",".","S","#"],
               ["#","#","#","#","#","#"]]
Output: 3
Explanation: We return only the number of times the box is pushed.

Example 2:

Input: grid = [["#","#","#","#","#","#"],
               ["#","T","#","#","#","#"],
               ["#",".",".","B",".","#"],
               ["#","#","#","#",".","#"],
               ["#",".",".",".","S","#"],
               ["#","#","#","#","#","#"]]
Output: -1

Example 3:

Input: grid = [["#","#","#","#","#","#"],
               ["#","T",".",".","#","#"],
               ["#",".","#","B",".","#"],
               ["#",".",".",".",".","#"],
               ["#",".",".",".","S","#"],
               ["#","#","#","#","#","#"]]
Output: 5
Explanation: push the box down, left, left, up and up.

 

Constraints:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 20
  • grid contains only characters '.', '#', 'S', 'T', or 'B'.
  • There is only one character 'S', 'B', and 'T' in the grid.

Approach Overview

Problem Overview: You are given a grid with walls, a player, a box, and a target. The player can move freely but can only push (not pull) the box. The task is to compute the minimum number of pushes required to move the box to the target cell.

Approach 1: Breadth-First Search with State Tracking (O((mn)^2) time, O((mn)^2) space)

Model the puzzle as a state search where each state contains both the box position and the player position. The BFS queue prioritizes states by the number of pushes, not simple movements. When the player moves behind the box and pushes it, a new state is created with the updated box location. Before each push, run a reachability check to confirm the player can walk to the required pushing position without crossing the box or walls. A visited set like (boxRow, boxCol, playerRow, playerCol) prevents revisiting states. This approach relies heavily on Breadth-First Search across a matrix grid to guarantee the minimum pushes.

Approach 2: A* Search for Optimal Pushes (O((mn)^2 log(mn)) time, O((mn)^2) space)

A* improves the search by guiding exploration toward the target using a heuristic. Each state still contains the box and player coordinates, but states are stored in a priority queue ordered by f = pushes + heuristic. A common heuristic is the Manhattan distance from the box to the target. This does not overestimate the required pushes, so the search remains optimal. Instead of expanding states purely level by level like BFS, A* prioritizes promising states and typically explores fewer configurations. The implementation uses a priority queue to efficiently select the next state with the smallest estimated cost.

Recommended for interviews: BFS with state tracking is the most common expected solution. It clearly models the puzzle as a graph search and guarantees the minimum number of pushes. Interviewers usually want to see correct state representation and reachability checks. Mentioning A* as an optimization shows deeper search algorithm knowledge and strong problem-solving maturity.

Approach 1: Breadth-First Search (BFS) with State Tracking

This approach uses a BFS strategy, commonly used for exploring shortest paths, which also tracks states consisting of the player's and the box’s positions along with the number of pushes made. Each state can be represented as a tuple consisting of these values. The BFS runs until the box reaches its target position or all possible states are exhausted. To ensure efficiency, already visited states are stored and checked before exploration to prevent cyclic paths.

This Python solution uses a BFS approach to explore all possible ways the player can push the box to the target. It tracks the player's and the box's current positions and checks all possible moves. The BFS ensures the shortest path is found by exploring in layers. The main components include state validation, tracking visited states, and maintaining a queue for the BFS exploration.

Code

Python

Java

Complexity

Time Complexity: O(m * n) due to traversing each cell, where m and n are the grid dimensions.
Space Complexity: O(m * n) for the space required to store states in the queue and visited set.

Try this approach in the editor →

Approach 2: A* Search for Optimal Pushes

This approach optimizes the BFS approach even further by using the A* search algorithm, which is a popular choice for pathfinding and graph traversal. In A*, each state is evaluated with a heuristic to estimate the minimum cost to reach the target. The heuristic can be the Manhattan distance from the box to the target which guides the search more directly towards optimal solutions more efficiently.

This C++ solution uses the A* algorithm which is advantageous over BFS by utilizing a heuristic approach. The heuristic guides the exploration to significantly reduce unnecessary steps by taking into consideration the Manhattan distance to the target. The state of the game is abstracted into a struct and processed through a priority queue, ensuring that the paths with the least cost are expanded first.

Code

C++

JavaScript

Complexity

Time Complexity: O((m * n)^2) in the worst case because of priority queue operations and heuristic calculations.
Space Complexity: O(m * n) for the storage of states.

Try this approach in the editor →

Approach 3: Double-ended Queue + BFS

We consider the player's position and the box's position as a state, i.e., (s_i, s_j, b_i, b_j), where (s_i, s_j) is the player's position, and (b_i, b_j) is the box's position. In the code implementation, we define a function f(i, j), which maps the two-dimensional coordinates (i, j) to a one-dimensional state number, i.e., f(i, j) = i times n + j, where n is the number of columns in the grid. So the player and the box's state is (f(s_i, s_j), f(b_i, b_j)).

First, we traverse the grid to find the initial positions of the player and the box, denoted as (s_i, s_j) and (b_i, b_j).

Then, we define a double-ended queue q, where each element is a triplet (f(s_i, s_j), f(b_i, b_j), d), indicating that the player is at (s_i, s_j), the box is at (b_i, b_j), and d pushes have been made. Initially, we add (f(s_i, s_j), f(b_i, b_j), 0) to the queue q.

Additionally, we use a two-dimensional array vis to record whether each state has been visited. Initially, vis[f(s_i, s_j), f(b_i, b_j)] is marked as visited.

Next, we start the breadth-first search.

In each step of the search, we take out the queue head element (f(s_i, s_j), f(b_i, b_j), d), and check whether grid[b_i][b_j] = 'T' is satisfied. If it is, it means the box has been pushed to the target position, and now d can be returned as the answer.

Otherwise, we enumerate the player's next move direction. The player's new position is denoted as (s_x, s_y). If (s_x, s_y) is a valid position, we judge whether (s_x, s_y) is the same as the box's position (b_i, b_j):

  • If they are the same, it means the player has reached the box's position and pushed the box forward by one step. The box's new position is (b_x, b_y). If (b_x, b_y) is a valid position, and the state (f(s_x, s_y), f(b_x, b_y)) has not been visited, then we add (f(s_x, s_y), f(b_x, b_y), d + 1) to the end of the queue q, and mark vis[f(s_x, s_y), f(b_x, b_y)] as visited.
  • If they are different, it means the player has not pushed the box. Then we only need to judge whether the state (f(s_x, s_y), f(b_i, b_j)) has been visited. If it has not been visited, then we add (f(s_x, s_y), f(b_i, b_j), d) to the head of the queue q, and mark vis[f(s_x, s_y), f(b_i, b_j)] as visited.

We continue the breadth-first search until the queue is empty.

Note, if the box is pushed, the push count d needs to be incremented by 1, and the new state is added to the end of the queue q. If the box is not pushed, the push count d remains unchanged, and the new state is added to the head of the queue q.

Finally, if no valid push scheme is found, then return -1.

The time complexity is O(m^2 times n^2), and the space complexity is O(m^2 times n^2). Where m and n are the number of rows and columns in the grid, respectively.

Code

Python

Java

C++

Go

TypeScript

Try this approach in the editor →

Complexity Comparison

ApproachComplexity
Breadth-First Search (BFS) with State Tracking

Time Complexity: O(m * n) due to traversing each cell, where m and n are the grid dimensions.
Space Complexity: O(m * n) for the space required to store states in the queue and visited set.

A* Search for Optimal Pushes

Time Complexity: O((m * n)^2) in the worst case because of priority queue operations and heuristic calculations.
Space Complexity: O(m * n) for the storage of states.

Double-ended Queue + BFS

Detailed Complexity Analysis

ApproachTimeSpaceWhen to Use
BFS with State TrackingO((mn)^2)O((mn)^2)Standard solution for interviews. Guarantees minimum pushes and easier to reason about.
A* Search with Priority QueueO((mn)^2 log(mn))O((mn)^2)When optimizing search exploration. Heuristic reduces explored states in large grids.

Video Solution

Hard Leetcode problem Move A Box To Target Location (with implementation)Errichto Algorithms38,576 views views

Watch 7 more video solutions →

Frequently Asked Questions

Is Minimum Moves to Move a Box to Their Target Location easy or hard?
Minimum Moves to Move a Box to Their Target Location is classified as a Hard problem. The difficulty comes from modeling the combined player–box state and performing nested reachability checks. Strong understanding of BFS, grid traversal, and state pruning is required.
Minimum Moves to Move a Box to Their Target Location Python/Java solution
Python and Java implementations typically use BFS with a queue and a visited set storing (boxRow, boxCol, playerRow, playerCol). The algorithm checks if the player can reach the pushing position and then pushes the box into the next cell. Each push increments the BFS level until the box reaches the target.
How to solve Minimum Moves to Move a Box to Their Target Location in O(n)?
The problem cannot be solved in linear O(n) time because the algorithm must explore combinations of player and box positions in the grid. The optimal practical solution is BFS or A* search with complexity around O((m*n)^2). Heuristics in A* can reduce the explored search space but do not change the worst‑case complexity.
What is the best approach for Minimum Moves to Move a Box to Their Target Location?
The most reliable approach is Breadth-First Search with full state tracking. Each state contains both the box position and the player position. BFS guarantees the minimum number of pushes because states are explored level by level based on push count. A reachability check ensures the player can stand behind the box before pushing it.
Is Minimum Moves to Move a Box to Their Target Location asked at Google/Amazon/Meta?
Grid search and box-pushing puzzles appear in interviews at companies like Google, Amazon, and Meta as advanced BFS or pathfinding problems. The problem tests graph modeling, state encoding, and shortest-path reasoning rather than simple traversal.
What data structure is used in Minimum Moves to Move a Box to Their Target Location?
The core data structures are a queue for BFS or a priority queue for A* search. A visited set or hash structure stores explored states defined by the box and player coordinates. The grid itself is treated as a matrix graph where each cell represents a node.
What is the time complexity of Minimum Moves to Move a Box to Their Target Location?
The typical BFS solution runs in O((m*n)^2) time where m and n are the grid dimensions. Each state represents a combination of box position and player position, and reachability checks are performed using BFS on the grid. Space complexity is also O((m*n)^2) for visited states and the queue.

Ready to solve this problem?

Practice Minimum Moves to Move a Box to Their Target Location with our built-in code editor and test cases.

Practice on FleetCode