用c语言编写一个程序,输入一个5×5的矩阵构成的迷宫的地图,其中0为障碍, 1为可通行的地方。迷宫的入口为左上角(1, 1),出口为右下角(5, 5),在迷宫中,只能从一个位置走到它的上、下、左、右四个方向之一。对于输入的迷宫结构,请找到从迷宫入口到出口的最少步数并输出(若不存在从入口到出口的路径,则输出: oops!)
时间: 2023-11-22 22:56:58 浏览: 59
以下是使用广度优先搜索算法来解决迷宫问题的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define ROW 5
#define COL 5
// 定义一个结构体表示坐标
typedef struct {
int row;
int col;
} Position;
// 定义队列元素类型
typedef struct {
Position pos;
int step;
} QueueElem;
// 定义队列结构体
typedef struct {
QueueElem *elems;
int front;
int rear;
int size;
} Queue;
// 初始化队列
void initQueue(Queue *q, int size) {
q->elems = (QueueElem *)malloc(sizeof(QueueElem) * size);
q->front = q->rear = 0;
q->size = size;
}
// 判断队列是否为空
int isEmpty(Queue *q) {
return q->front == q->rear;
}
// 入队操作
void enQueue(Queue *q, QueueElem elem) {
if ((q->rear + 1) % q->size == q->front) { // 队列已满
printf("Queue is full!\n");
exit(1);
}
q->elems[q->rear] = elem;
q->rear = (q->rear + 1) % q->size;
}
// 出队操作
QueueElem deQueue(Queue *q) {
if (isEmpty(q)) {
printf("Queue is empty!\n");
exit(1);
}
QueueElem elem = q->elems[q->front];
q->front = (q->front + 1) % q->size;
return elem;
}
// 判断当前位置是否可通行
int isPassable(int maze[][COL], Position pos) {
if (pos.row < 0 || pos.row >= ROW || pos.col < 0 || pos.col >= COL) { // 越界
return 0;
}
return maze[pos.row][pos.col] == 1;
}
// 广度优先搜索算法
int bfs(int maze[][COL]) {
Queue q;
initQueue(&q, ROW * COL);
Position directions[] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}}; // 上左下右四个方向
int visited[ROW][COL] = {0}; // 标记已访问的位置
Position start = {0, 0};
QueueElem startElem = {start, 0};
enQueue(&q, startElem);
visited[start.row][start.col] = 1;
while (!isEmpty(&q)) {
QueueElem curr = deQueue(&q);
if (curr.pos.row == ROW - 1 && curr.pos.col == COL - 1) { // 到达终点
return curr.step + 1;
}
for (int i = 0; i < 4; i++) {
Position nextPos = {curr.pos.row + directions[i].row, curr.pos.col + directions[i].col};
if (isPassable(maze, nextPos) && !visited[nextPos.row][nextPos.col]) { // 可通行且未访问过
QueueElem nextElem = {nextPos, curr.step + 1};
enQueue(&q, nextElem);
visited[nextPos.row][nextPos.col] = 1;
}
}
}
return -1; // 无法到达终点
}
int main() {
int maze[ROW][COL];
printf("Please input the maze:\n");
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
scanf("%d", &maze[i][j]);
}
}
int steps = bfs(maze);
if (steps == -1) {
printf("oops!\n");
} else {
printf("The minimum steps from (1, 1) to (5, 5) is %d\n", steps);
}
return 0;
}
```
程序中使用了队列来实现广度优先搜索算法,通过遍历迷宫中的每个可通行的位置来找到最短路径。在遍历时使用一个二维数组来标记已经访问过的位置,以避免重复访问。如果搜索过程中到达了终点,则返回路径长度;否则,说明无法到达终点,返回-1。
阅读全文