赞
踩
机器猫被困在一个矩形迷宫里。
迷宫可以视为一个n x m 矩阵,每个位置要么是空地,要么是墙。机器猫只能从一个空地走到其上、下、左、右的空地。
机器猫初始时位于(1,1)的位置,问能否走到(n,m)位置。
第一行,两个正整数 n,m。
接下来几行,输入这个迷宫。每行输入一个长为 m 的字符串,#表示墙,. 表示空地。
仅一行,一个字符串。如果机器猫能走到(n,m),则输出 Yes;否则输出 No 。
- 3 5
- .##.#
- .#...
- ...#.
Yes
样例解释
路线如下:(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)均为空地。
- #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;
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。