LeetCode //C - 1926. Nearest Exit from Entrance in Maze

1926. Nearest Exit from Entrance in Maze

You are given an m x n matrix maze (0-indexed) with empty cells (represented as '.') and walls (represented as '+'). You are also given the entrance of the maze, where entrance = entrancerow, entrancecol denotes the row and column of the cell you are initially standing at.

In one step, you can move one cell up, down, left, or right. You cannot step into a cell with a wall, and you cannot step outside the maze. Your goal is to find the nearest exit from the entrance. An exit is defined as an empty cell that is at the border of the maze. The entrance does not count as an exit.

Return the number of steps in the shortest path from the entrance to the nearest exit, or -1 if no such path exists.

Example 1:

Input: maze = \["+","+",".","+",".",".",".","+","+","+","+","."], entrance = 1,2
Output: 1
Explanation: There are 3 exits in this maze at 1,0, 0,2, and 2,3.

Initially, you are at the entrance cell 1,2.

  • You can reach 1,0 by moving 2 steps left.

  • You can reach 0,2 by moving 1 step up.

It is impossible to reach 2,3 from the entrance.

Thus, the nearest exit is 0,2, which is 1 step away.

Example 2:

Input: maze = \["+","+","+",".",".",".","+","+","+"], entrance = 1,0
Output: 2
Explanation: There is 1 exit in this maze at 1,2.

1,0 does not count as an exit since it is the entrance cell.

Initially, you are at the entrance cell 1,0.

  • You can reach 1,2 by moving 2 steps right.

Thus, the nearest exit is 1,2, which is 2 steps away.

Example 3:

Input: maze = \[".","+"], entrance = 0,0
Output: -1
Explanation: There are no exits in this maze.

Constraints:
  • maze.length == m
  • mazei.length == n
  • 1 <= m, n <= 100
  • mazeij is either '.' or '+'.
  • entrance.length == 2
  • 0 <= entrancerow < m
  • 0 <= entrancecol < n
  • entrance will always be an empty cell.

From: LeetCode

Link: 1926. Nearest Exit from Entrance in Maze


Solution:

Ideas:

This function uses Breadth-First Search (BFS) to find the nearest exit. It checks all possible paths from the entrance and returns the number of steps to the nearest exit. If no exit is reachable, it returns -1. Please note that this code should be part of a complete C program and compiled with a C compiler to run. It assumes that the maze is properly allocated and passed to the function along with the size parameters and entrance coordinates.

Code:
c 复制代码
// Helper function to check if the current position is valid and not a wall.
int isValid(char **maze, int x, int y, int m, int n) {
    if (x >= 0 && x < m && y >= 0 && y < n && maze[x][y] == '.')
        return 1;
    return 0;
}

// Helper function to check if the current position is at the border and not the entrance.
int isExit(char **maze, int x, int y, int m, int n, int* entrance) {
    if ((x == 0 || x == m - 1 || y == 0 || y == n - 1) && (x != entrance[0] || y != entrance[1]))
        return 1;
    return 0;
}

int nearestExit(char** maze, int mazeSize, int* mazeColSize, int* entrance, int entranceSize) {
    int directions[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; // Up, Down, Left, Right
    int m = mazeSize, n = mazeColSize[0];
    int queueSize = m * n;
    int queue[queueSize][3]; // Queue to store the x, y, and distance
    int front = 0, rear = 0;

    // Initialize the queue with the entrance position
    queue[rear][0] = entrance[0];
    queue[rear][1] = entrance[1];
    queue[rear][2] = 0;
    rear++;

    maze[entrance[0]][entrance[1]] = '+'; // Mark the entrance as visited

    while (front < rear) {
        // Dequeue the front element
        int x = queue[front][0];
        int y = queue[front][1];
        int dist = queue[front][2];
        front++;

        // Check if we've reached an exit
        if (isExit(maze, x, y, m, n, entrance)) {
            return dist;
        }

        // Check all four possible directions
        for (int i = 0; i < 4; i++) {
            int newX = x + directions[i][0];
            int newY = y + directions[i][1];

            // If valid, not a wall, and not visited, add to queue
            if (isValid(maze, newX, newY, m, n)) {
                maze[newX][newY] = '+'; // Mark as visited
                queue[rear][0] = newX;
                queue[rear][1] = newY;
                queue[rear][2] = dist + 1;
                rear++;
            }
        }
    }

    // If no exit is reached, return -1
    return -1;
}
相关推荐
小羊在睡觉10 小时前
力扣84. 柱状图中最大的矩形
后端·算法·leetcode·golang·go
3DVisionary10 小时前
蓝光三维扫描:医疗制造的精度焦虑怎么解
人工智能·算法·制造·蓝光三维扫描·医疗制造·三维检测·义齿检测
好评笔记10 小时前
机器学习面试八股——常用损失函数
人工智能·深度学习·算法·机器学习·校招
weixin_4684668510 小时前
全局与局部注意力机制新手实战指南
人工智能·python·深度学习·算法·自然语言处理·transformer·注意力机制
sheeta199811 小时前
LeetCode 每日一题笔记 日期:2026.05.29 题目:3300. 最小元素
笔记·leetcode
_日拱一卒11 小时前
LeetCode:994腐烂的橘子
java·数据结构·算法·leetcode·深度优先
珂朵莉MM11 小时前
第七届全球校园人工智能算法精英大赛-算法巅峰赛产业命题赛第3赛季优化题--束搜索
人工智能·算法
Omics Pro12 小时前
首个!外源天然产物综合性代谢图谱
数据库·人工智能·算法·机器学习·r语言
voidmort12 小时前
3. 微调(Fine-tuning)与强化学习(RL)的核心思想
python·深度学习·算法
Bluetooth73012 小时前
c语言一维数组
c语言