Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

001368 minimum cost to make at least one valid path in a grid #1175

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
102 commits
Select commit Hold shift + click to select a range
d7c22f9
Automated commit 1
mah-shamim Jan 18, 2025
0f67b2e
Automated commit rollback 1
mah-shamim Jan 18, 2025
e3394bd
Automated commit 2
mah-shamim Jan 18, 2025
0852b3c
Automated commit rollback 2
mah-shamim Jan 18, 2025
18e1e8e
Automated commit 3
mah-shamim Jan 18, 2025
850017d
Automated commit rollback 3
mah-shamim Jan 18, 2025
93f1e84
Automated commit 4
mah-shamim Jan 18, 2025
c48d5f3
Automated commit rollback 4
mah-shamim Jan 18, 2025
4286718
Automated commit 5
mah-shamim Jan 18, 2025
cd09298
Automated commit rollback 5
mah-shamim Jan 18, 2025
d295fbd
Automated commit 6
mah-shamim Jan 18, 2025
0f9c7ad
Automated commit rollback 6
mah-shamim Jan 18, 2025
37856ba
Automated commit 7
mah-shamim Jan 18, 2025
02f9aa1
Automated commit rollback 7
mah-shamim Jan 18, 2025
0a4313c
Automated commit 8
mah-shamim Jan 18, 2025
3e80ebd
Automated commit rollback 8
mah-shamim Jan 18, 2025
5f794b2
Automated commit 9
mah-shamim Jan 18, 2025
336f4a2
Automated commit rollback 9
mah-shamim Jan 18, 2025
587ea18
Automated commit 10
mah-shamim Jan 18, 2025
e6d28c5
Automated commit rollback 10
mah-shamim Jan 18, 2025
fd576e4
Automated commit 11
mah-shamim Jan 18, 2025
22e4ce1
Automated commit rollback 11
mah-shamim Jan 18, 2025
a0708b8
Automated commit 12
mah-shamim Jan 18, 2025
ae829ef
Automated commit rollback 12
mah-shamim Jan 18, 2025
62df839
Automated commit 13
mah-shamim Jan 18, 2025
18f978c
Automated commit rollback 13
mah-shamim Jan 18, 2025
5e4ef9a
Automated commit 14
mah-shamim Jan 18, 2025
7c2b0f1
Automated commit rollback 14
mah-shamim Jan 18, 2025
90cb5d3
Automated commit 15
mah-shamim Jan 18, 2025
cde151c
Automated commit rollback 15
mah-shamim Jan 18, 2025
9f3956f
Automated commit 16
mah-shamim Jan 18, 2025
79f14a7
Automated commit rollback 16
mah-shamim Jan 18, 2025
62f6f79
Automated commit 17
mah-shamim Jan 18, 2025
c49b6b4
Automated commit rollback 17
mah-shamim Jan 18, 2025
d8b396d
Automated commit 18
mah-shamim Jan 18, 2025
11a4825
Automated commit rollback 18
mah-shamim Jan 18, 2025
58f61b9
Automated commit 19
mah-shamim Jan 18, 2025
f4cb13f
Automated commit rollback 19
mah-shamim Jan 18, 2025
a7ae447
Automated commit 20
mah-shamim Jan 18, 2025
066ff7a
Automated commit rollback 20
mah-shamim Jan 18, 2025
695c8da
Automated commit 21
mah-shamim Jan 18, 2025
03f1380
Automated commit rollback 21
mah-shamim Jan 18, 2025
f5d252e
Automated commit 22
mah-shamim Jan 18, 2025
bb1878c
Automated commit rollback 22
mah-shamim Jan 18, 2025
5c00bdd
Automated commit 23
mah-shamim Jan 18, 2025
a5e8aab
Automated commit rollback 23
mah-shamim Jan 18, 2025
bc974a8
Automated commit 24
mah-shamim Jan 18, 2025
7ca8d79
Automated commit rollback 24
mah-shamim Jan 18, 2025
1525ae4
Automated commit 25
mah-shamim Jan 18, 2025
e9567cf
Automated commit rollback 25
mah-shamim Jan 18, 2025
c1d935f
Automated commit 26
mah-shamim Jan 18, 2025
5ba4dba
Automated commit rollback 26
mah-shamim Jan 18, 2025
6c8d004
Automated commit 27
mah-shamim Jan 18, 2025
92cf95b
Automated commit rollback 27
mah-shamim Jan 18, 2025
a07c21a
Automated commit 28
mah-shamim Jan 18, 2025
d196b4c
Automated commit rollback 28
mah-shamim Jan 18, 2025
0fe37fe
Automated commit 29
mah-shamim Jan 18, 2025
60f14bc
Automated commit rollback 29
mah-shamim Jan 18, 2025
4de51f5
Automated commit 30
mah-shamim Jan 18, 2025
9465b8d
Automated commit rollback 30
mah-shamim Jan 18, 2025
ab62241
Automated commit 31
mah-shamim Jan 18, 2025
e06ff76
Automated commit rollback 31
mah-shamim Jan 18, 2025
93d0282
Automated commit 32
mah-shamim Jan 18, 2025
4522cf1
Automated commit rollback 32
mah-shamim Jan 18, 2025
e7aae4b
Automated commit 33
mah-shamim Jan 18, 2025
0c70914
Automated commit rollback 33
mah-shamim Jan 18, 2025
28d234c
Automated commit 34
mah-shamim Jan 18, 2025
167dd31
Automated commit rollback 34
mah-shamim Jan 18, 2025
47bab1b
Automated commit 35
mah-shamim Jan 18, 2025
c4b58f8
Automated commit rollback 35
mah-shamim Jan 18, 2025
acf911a
Automated commit 36
mah-shamim Jan 18, 2025
acefb49
Automated commit rollback 36
mah-shamim Jan 18, 2025
4f11832
Automated commit 37
mah-shamim Jan 18, 2025
eb13e7e
Automated commit rollback 37
mah-shamim Jan 18, 2025
baaecab
Automated commit 38
mah-shamim Jan 18, 2025
0fd980c
Automated commit rollback 38
mah-shamim Jan 18, 2025
9c968f0
Automated commit 39
mah-shamim Jan 18, 2025
2b6f781
Automated commit rollback 39
mah-shamim Jan 18, 2025
f7791e6
Automated commit 40
mah-shamim Jan 18, 2025
0b002c6
Automated commit rollback 40
mah-shamim Jan 18, 2025
d228ce0
Automated commit 41
mah-shamim Jan 18, 2025
54d8b8f
Automated commit rollback 41
mah-shamim Jan 18, 2025
56da191
Automated commit 42
mah-shamim Jan 18, 2025
6ccd37d
Automated commit rollback 42
mah-shamim Jan 18, 2025
05fbe8f
Automated commit 43
mah-shamim Jan 18, 2025
d9f16f1
Automated commit rollback 43
mah-shamim Jan 18, 2025
8622f79
Automated commit 44
mah-shamim Jan 18, 2025
42076d0
Automated commit rollback 44
mah-shamim Jan 18, 2025
bb405b0
Automated commit 45
mah-shamim Jan 18, 2025
404b3bc
Automated commit rollback 45
mah-shamim Jan 18, 2025
71f41cf
Automated commit 46
mah-shamim Jan 18, 2025
f0bb599
Automated commit rollback 46
mah-shamim Jan 18, 2025
c2487a0
Automated commit 47
mah-shamim Jan 18, 2025
eadba74
Automated commit rollback 47
mah-shamim Jan 18, 2025
fb14587
Automated commit 48
mah-shamim Jan 18, 2025
401d343
Automated commit rollback 48
mah-shamim Jan 18, 2025
74e0c8a
Automated commit 49
mah-shamim Jan 18, 2025
c9bc688
Automated commit rollback 49
mah-shamim Jan 18, 2025
fe7aceb
Automated commit 50
mah-shamim Jan 18, 2025
20cb043
Automated commit rollback 50
mah-shamim Jan 18, 2025
02b1a01
#1173, #1174 leetcode problems 001368-minimum-cost-to-make-at-least-o…
mah-shamim Jan 18, 2025
641092f
#1173, #1174 leetcode problems 001368-minimum-cost-to-make-at-least-o…
mah-shamim Jan 18, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
mah-shamim marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
1368\. Minimum Cost to Make at Least One Valid Path in a Grid

**Difficulty:** Hard

**Topics:** `Array`, `Breadth-First Search`, `Graph`, `Heap (Priority Queue)`, `Matrix`, `Shortest Path`

Given an `m x n` grid. Each cell of the grid has a sign pointing to the next cell you should visit if you are currently in this cell. The sign of `grid[i][j]` can be:

- `1` which means go to the cell to the right. (i.e go from `grid[i][j]` to `grid[i][j + 1]`)
- `2` which means go to the cell to the left. (i.e go from `grid[i][j]` to `grid[i][j - 1]`)
- `3` which means go to the lower cell. (i.e go from `grid[i][j]` to `grid[i + 1][j]`)
- `4` which means go to the upper cell. (i.e go from `grid[i][j]` to `grid[i - 1][j]`)

Notice that there could be some signs on the cells of the grid that point outside the grid.

You will initially start at the upper left cell `(0, 0)`. A valid path in the grid is a path that starts from the upper left cell `(0, 0)` and ends at the bottom-right cell `(m - 1, n - 1)` following the signs on the grid. The valid path does not have to be the shortest.

You can modify the sign on a cell with `cost = 1`. You can modify the sign on a cell one time only.

Return _the minimum cost to make the grid have at least one valid path_.

**Example 1:**

![grid1](https://assets.leetcode.com/uploads/2020/02/13/grid1.png)

- **Input:** grid = [[1,1,1,1],[2,2,2,2],[1,1,1,1],[2,2,2,2]]
- **Output:** 3
- **Explanation:** You will start at point (0, 0).
The path to (3, 3) is as follows. (0, 0) --> (0, 1) --> (0, 2) --> (0, 3) change the arrow to down with cost = 1 --> (1, 3) --> (1, 2) --> (1, 1) --> (1, 0) change the arrow to down with cost = 1 --> (2, 0) --> (2, 1) --> (2, 2) --> (2, 3) change the arrow to down with cost = 1 --> (3, 3)
The total cost = 3.

**Example 2:**

![grid2](https://assets.leetcode.com/uploads/2020/02/13/grid2.png)

- **Input:** grid = [[1,1,3],[3,2,2],[1,1,4]]
- **Output:** 0
- **Explanation:** You can follow the path from (0, 0) to (2, 2).


**Example 3:**

![grid3](https://assets.leetcode.com/uploads/2020/02/13/grid3.png)

- **Input:** grid = [[1,2],[4,3]]
- **Output:** 1


**Constraints:**

- `m == grid.length`
- `n == grid[i].length`
- `1 <= m, n <= 100`
- `1 <= grid[i][j] <= 4`


**Hint:**
1. Build a graph where `grid[i][j]` is connected to all the four side-adjacent cells with weighted edge. the weight is `0` if the sign is pointing to the adjacent cell or `1` otherwise.
2. Do BFS from `(0, 0)` visit all edges with `weight = 0` first. the answer is the distance to `(m -1, n - 1)`.



**Solution:**

We can use the **0-1 BFS** approach. The idea is to traverse the grid using a deque (double-ended queue) where the cost of modifying the direction determines whether a cell is added to the front or back of the deque. The grid is treated as a graph where each cell has weighted edges based on whether its current direction matches the movement to its neighbors.

Let's implement this solution in PHP: **[1368. Minimum Cost to Make at Least One Valid Path in a Grid](https://github.com/mah-shamim/leet-code-in-php/tree/main/algorithms/001368-minimum-cost-to-make-at-least-one-valid-path-in-a-grid/solution.php)**

```php
<?php
/**
* @param Integer[][] $grid
* @return Integer
*/
function minCost($grid) {
...
...
...
/**
* go to ./solution.php
*/
}

// Example Test Cases
$grid1 = [[1,1,1,1],[2,2,2,2],[1,1,1,1],[2,2,2,2]];
echo minCost($grid1) . "\n"; // Output: 3

$grid2 = [[1,1,3],[3,2,2],[1,1,4]];
echo minCost($grid2) . "\n"; // Output: 0

$grid3 = [[1,2],[4,3]];
echo minCost($grid3) . "\n"; // Output: 1
?>
```

### Explanation:

1. **Direction Mapping:** Each direction (`1` for right, `2` for left, `3` for down, `4` for up) is mapped to an array of movement deltas `[dx, dy]`.

2. **0-1 BFS:**
- A deque is used to prioritize cells with lower costs. Cells that do not require modifying the direction are added to the front (`unshift`), while those that require a modification are added to the back (`enqueue`).
- This ensures that cells are processed in increasing order of cost.

3. **Distance Array:** A 2D array `$dist` keeps track of the minimum cost to reach each cell. It is initialized with `PHP_INT_MAX` for all cells except the starting cell `(0, 0)`.

4. **Edge Weights:**
- If the current cell's sign matches the intended direction, the cost remains the same.
- Otherwise, modifying the direction incurs a cost of `1`.

5. **Termination:** The loop terminates once all cells have been processed. The result is the value in `$dist[$m - 1][$n - 1]`, representing the minimum cost to reach the bottom-right corner.

### Complexity:
- **Time Complexity:** _**O(m × n)**_, since each cell is processed once.
- **Space Complexity:** _**O(m × n)**_, for the distance array and deque.

**Contact Links**

If you found this series helpful, please consider giving the **[repository](https://github.com/mah-shamim/leet-code-in-php)** a star on GitHub or sharing the post on your favorite social networks 😍. Your support would mean a lot to me!

If you want more helpful content like this, feel free to follow me:

- **[LinkedIn](https://www.linkedin.com/in/arifulhaque/)**
- **[GitHub](https://github.com/mah-shamim)**
mah-shamim marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
<?php

class Solution {

/**
* @param Integer[][] $grid
* @return Integer
*/
function minCost($grid) {
$m = count($grid);
$n = count($grid[0]);

// Direction vectors for the signs (right, left, down, up)
$directions = [
[0, 1], // 1: right
[0, -1], // 2: left
[1, 0], // 3: down
[-1, 0] // 4: up
];

// Deque for 0-1 BFS
$deque = new SplQueue();
$deque->enqueue([0, 0, 0]); // [row, col, cost]

// Distance array to keep track of the minimum cost to reach each cell
$dist = array_fill(0, $m, array_fill(0, $n, PHP_INT_MAX));
$dist[0][0] = 0;

while (!$deque->isEmpty()) {
list($x, $y, $cost) = $deque->dequeue();

// If we've already found a better way, skip this cell
if ($dist[$x][$y] < $cost) {
continue;
}

// Traverse all 4 directions
foreach ($directions as $dirIndex => $dir) {
$nx = $x + $dir[0];
$ny = $y + $dir[1];
$newCost = $cost;

// Check if the new cell is within bounds
if ($nx >= 0 && $nx < $m && $ny >= 0 && $ny < $n) {
// If the direction of the current cell matches the intended movement
if ($grid[$x][$y] == $dirIndex + 1) {
$newCost = $cost; // No additional cost
} else {
$newCost = $cost + 1; // Modify the direction with cost 1
}

// Update distance and add to deque
if ($newCost < $dist[$nx][$ny]) {
$dist[$nx][$ny] = $newCost;
if ($newCost == $cost) {
$deque->unshift([$nx, $ny, $newCost]); // Add to front
} else {
$deque->enqueue([$nx, $ny, $newCost]); // Add to back
}
}
}
}
}

// Return the minimum cost to reach the bottom-right corner
return $dist[$m - 1][$n - 1];
}
}