问题描述
给定一个大小为N*M的迷宫。迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四格的通道移动。请求出从起点到终点所需的最小步数(起点一定可以到达终点)。
限制条件
N,M<=100
样例
输入:N=10,M=10
//迷宫如下图所示。'#','.','S','G'分别表示墙壁,通道,起点和终点。
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#
输出:22
分析
宽度优先搜索按照距离开始状态由近及远的顺序进行搜索,因此可以很容易地用来求最短路径、最少操作之类问题的答案。
首先将起点存入队列,然后从队列中取出队头元素,遍历队头元素上下左右四个方向的通道。若其不是终点,则将此点加入队列,并存储从开始到该点的距离。然后处理下一个遍历到的点…直至队列为空。
代码
#include<stdio.h>
#define INF 100000000
#define MAX_N 100
#define MAX_M 100
//输入
char maze[MAX_N][MAX_M+1]; //表示迷宫的字符串的数组
int N,M;
int sx,sy; //起点坐标
int gx,gy; //终点坐标
int d[MAX_N][MAX_M]; //到各个位置的最短距离的数组
//队列存储结构
int queue_x[MAX_N*MAX_M]; //存储进入队列的横坐标
int queue_y[MAX_N*MAX_M]; //储进入队列的纵坐标
int front,rear;
//将坐标(x,y)加入队列queue_x,queue_y
void enQueue(int x, int y){
queue_x[rear++] = x;
queue_y[rear++] = y;
}
//将横坐标为x的移出queue_x队列
int deQueue_x(){
return queue_x[front++];
}
//将纵坐标为y的移出queue_y队列
int deQueue_y(){
return queue_y[front++];
}
//求从{sx,sy}到{gx,gy}的最短路径
//如果无法到达,则是INF
void bfs(){
//初始化
front = 0;
rear = 0;
//当前遍历到的坐标
int current_x,current_y;
//把所有的位置都初始化为INF
for(int i=0; i<N; i++)
for(int j=0; j<M; j++)
d[i][j] = INF;
//将起点加入队列,并把这一地点的距离设置为0
enQueue(sx,sy);
d[sx][sy] = 0;
//不断循环, 直到队列的长度为0
while(maze[current_x=deQueue_x()][current_y=deQueue_y()] != 'G'){
//遍历左右两面
for(int dx=-1,dy=0; dx<=1; dx+=2){
int x = current_x + dx;
int y = current_y + dy;
if(x>=0 && x<N && y>=0 && y<M){ //判断未出界
if((maze[x][y]=='G' || maze[x][y]=='.') && d[x][y]==INF){
d[x][y] = d[current_x][current_y] + 1;
enQueue(x,y);
}
}
}
//遍历上下两面
for(int dy=-1,dx=0; dy<=1; dy+=2){
int x = current_x + dx;
int y = current_y + dy;
if(x>=0 && x<N && y>=0 && y<M){ //判断未出界
if((maze[x][y]=='G' || maze[x][y]=='.') && d[x][y]==INF){
d[x][y] = d[current_x][current_y] + 1;
enQueue(x,y);
}
}
}
}
}
int main(){
scanf("%d %d",&N,&M);
getchar();
for(int i=0; i<N; i++){
for(int j=0; j<M; j++){
scanf("%c",&maze[i][j]);
//确定起点坐标
if(maze[i][j] == 'S'){
sx = i;
sy = j;
}
//确定终点坐标
if(maze[i][j] == 'G'){
gx = i;
gy = j;
}
}
getchar();
}
bfs();
//输出最终结果
printf("%d\n",d[gx][gy]);
return 0;
}
https://ask.csdn.net/questions/7965978
还是之前的问题么?贴一下你的错误信息,以及你的输入,看下