TGViewer
C# | LeetCode C# | LeetCode @easy_c_sharp_task · 3.18K subscribers
Post #1638 239
Задача: 980. Unique Paths III
Сложность: hard

Вам дан целочисленный массив grid размером m x n, где grid[i][j] может быть:

1, представляющая начальную клетку. Существует ровно одна начальная клетка.
2, представляющая конечную клетку. Существует ровно одна конечная клетка.
0, представляющая пустые клетки, по которым можно ходить.
-1, представляющая препятствия, по которым нельзя ходить.
Верните количество 4-направленных путей от начальной клетки до конечной клетки, которые проходят по каждой непересекаемой клетке ровно один раз.

Пример:
Input: grid = [[1,0,0,0],[0,0,0,0],[0,0,2,-1]]
Output: 2
Explanation: We have the following two paths:
1. (0,0),(0,1),(0,2),(0,3),(1,3),(1,2),(1,1),(1,0),(2,0),(2,1),(2,2)
2. (0,0),(1,0),(2,0),(2,1),(1,1),(0,1),(0,2),(0,3),(1,3),(1,2),(2,2)


👨‍💻 Алгоритм:

1⃣Как видно, метод обратного отслеживания (backtracking) является методологией для решения определенного типа задач.

2⃣Для задачи обратного отслеживания можно сказать, что существует тысяча реализаций обратного отслеживания на тысячу людей, как будет видно из дальнейшей реализации.

3⃣Здесь мы просто покажем один пример реализации, следуя псевдокоду, показанному в разделе интуиции.

😎 Решение:
public class Solution {
private int rows, cols;
private int[,] grid;
private int pathCount;

private void Backtrack(int row, int col, int remain) {
if (grid[row, col] == 2 && remain == 1) {
pathCount += 1;
return;
}

int temp = grid[row, col];
grid[row, col] = -4;
remain -= 1;

int[] rowOffsets = {0, 0, 1, -1};
int[] colOffsets = {1, -1, 0, 0};
for (int i = 0; i < 4; ++i) {
int nextRow = row + rowOffsets[i];
int nextCol = col + colOffsets[i];

if (0 > nextRow || nextRow >= rows || 0 > nextCol || nextCol >= cols)
continue;

if (grid[nextRow, nextCol] < 0)
continue;

Backtrack(nextRow, nextCol, remain);
}

grid[row, col] = temp;
}

public int UniquePathsIII(int[,] grid) {
int nonObstacles = 0, startRow = 0, startCol = 0;

rows = grid.GetLength(0);
cols = grid.GetLength(1);
this.grid = grid;

for (int row = 0; row < rows; ++row)
for (int col = 0; col < cols; ++col) {
int cell = grid[row, col];
if (cell >= 0)
nonObstacles += 1;
if (cell == 1) {
startRow = row;
startCol = col;
}
}

pathCount = 0;
Backtrack(startRow, startCol, nonObstacles);

return pathCount;
}
}


Ставь 👍 и забирай 📚 Базу знаний
More from @easy_c_sharp_task
  1. Oct 11, 2026Задача: 1061. Lexicographically Smallest Equivalent String Сложность: medium Даны две стро…
  2. Oct 9, 2026Задача: 525. Contiguous Array Сложность: medium Дан бинарный массив nums. Верните максимал…
  3. Oct 7, 2026Задача: 1509. Minimum Difference Between Largest and Smallest Value in Three Moves Сложнос…
  4. Oct 7, 2026🔥 Скрытые вакансии с удаленной работой для C# разработчика, которые нигде больше не публи…
  5. Oct 6, 2026Задача: 645. Set Mismatch Сложность: easy У вас есть набор целых чисел s, который изначаль…
  6. Oct 5, 2026Задача: 927. Three Equal Parts Сложность: hard Вам дан массив arr, состоящий только из нул…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →