C语言基础题:迷宫寻路(C语言版)

1.题目描述

机器猫被困在一个矩形迷宫里。

迷宫可以视为一个n x m 矩阵,每个位置要么是空地,要么是墙。机器猫只能从一个空地走到其上、下、左、右的空地。

机器猫初始时位于(1,1)的位置,问能否走到(n,m)位置。

2.输入格式

第一行,两个正整数 n,m。

接下来几行,输入这个迷宫。每行输入一个长为 m 的字符串,#表示墙,. 表示空地。

3.输出格式

仅一行,一个字符串。如果机器猫能走到(n,m),则输出 Yes;否则输出 No 。

4.输入输出样例

1.输入:
cpp 复制代码
3 5
.##.#
.#...
...#.
2.输出:
cpp 复制代码
Yes

5.说明/提示

样例解释

路线如下:(1,1)→(2,1)→(3,1)→(3,2)→(3,3)→(2,3)→(2,4)→(2,5)→(3,5)

数据规模与约定

对于 100% 的数据,保证1< n,m < 100,(1,1)和(n,m)均为空地。

代码:

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>

#define MAXN 1000

typedef struct {
    int x, y;
} Point;

int n, m;
char maze[MAXN][MAXN + 1];
int visited[MAXN][MAXN]; // 访问标记
Point queue[MAXN * MAXN]; // 队列用于 BFS
int front = 0, rear = 0;

// 移动方向:上下左右
int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};

void enqueue(Point p) {
    queue[rear++] = p;
}

Point dequeue() {
    return queue[front++];
}

int is_valid(int x, int y) {
    return (x >= 0 && x < n && y >= 0 && y < m && maze[x][y] == '.' && !visited[x][y]);
}

int bfs() {
    enqueue((Point){0, 0}); // 从 (0,0) 开始
    visited[0][0] = 1; // 标记为已访问

    while (front < rear) {
        Point current = dequeue();
        
        // 如果到达终点 (n-1, m-1)
        if (current.x == n - 1 && current.y == m - 1) {
            return 1; // 可到达
        }

        // 检查四个方向
        for (int i = 0; i < 4; i++) {
            int new_x = current.x + dir[i][0];
            int new_y = current.y + dir[i][1];

            if (is_valid(new_x, new_y)) {
                visited[new_x][new_y] = 1; // 标记为已访问
                enqueue((Point){new_x, new_y}); // 入队
            }
        }
    }
    return 0; // 不可到达
}

int main() {
    scanf("%d %d", &n, &m);
    
    // 读取迷宫
    for (int i = 0; i < n; i++) {
        scanf("%s", maze[i]);
    }

    // 如果起点或终点是墙,直接输出 No
    if (maze[0][0] == '#' || maze[n-1][m-1] == '#') {
        printf("No\n");
        return 0;
    }

    // 执行 BFS
    if (bfs()) {
        printf("Yes\n");
    } else {
        printf("No\n");
    }

    return 0;
}
相关推荐
多弗朗皮卡丘13 分钟前
数据结构9:排序算法
c语言·数据结构·排序算法
nvvas34 分钟前
Java 入门(四):数组——数据的集合管理
java·开发语言
Y3815326621 小时前
SERP 数据清洗实战:字段标准化、日期解析与去重键
开发语言·数据库·python·python数据库
君顾12 小时前
本地城市低空经济管理系统定制:城市级低空运营平台架构与落地实战
java·开发语言·飞手
多多鼠3 小时前
System Prompt 的“版本漂移”问题:从变更管理到 A/B 测试体系
开发语言·网络·人工智能·python·langchain
WiChP3 小时前
【V0.1B16】从零开始的2D游戏引擎开发之路
开发语言·算法·游戏引擎
孙启超3 小时前
【AI开发之Rust】第 8 课:泛型、trait 与 trait 对象
开发语言·后端·rust
2501_933670794 小时前
经营财务岗技能栈拆解:Excel、SQL、BI、预算分析怎么准备
开发语言
老当益壮梁奶奶4 小时前
ARM 汇编学习笔记(二)启动代码、指令、函数调用与 C 混合编程
c语言·arm开发·单片机·嵌入式硬件·51单片机
数据狐(Datafox)4 小时前
1688商品列表API接口解析(附 JSON 样例)
java·开发语言·数据库·爬虫·json