POJ 3984 迷宫问题【迷宫最短路径 bfs】
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXL = 10; // 矩阵最大宽度
char maze[MAXL][MAXL]; // 迷宫
bool vis[MAXL][MAXL]; // 访问标记
int n, m; // 迷宫的长和宽
int dirx[4] = {0, 1, 0, -1};
int diry[4] = {1, 0, -1, 0}; // 移动方向
typedef struct point{
int x, y;
}P; // 坐标
P path[MAXL*MAXL]; // 路径队列
int pre[MAXL*MAXL]; // 记录父结点
P start, goal; // 起点 终点
P current, next; // 当前坐标 下一步的坐标
void Output(){
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
printf("%d ", maze[i][j]);
}
printf("
");
}
}
void Input(){
memset(maze, 0, sizeof(maze));
memset(vis, 0, sizeof(vis));
n = 5;
m = 5;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
scanf("%c", &maze[i][j]);
maze[i][j] -= '0';
if(j != n-1) getchar(); // 输入空格
}
getchar(); // 输入回车
}
//Output();
}
void Print(int pos){
if(pos == 0){ // 输出起点
printf("(%d, %d)
", path[pos].x, path[pos].y);
}
else{
int pointer;
pointer = pre[pos]; // 父结点在路径中的位置
Print(pointer);
printf("(%d, %d)
", path[pos].x, path[pos].y);
}
}
void bfs(){
start.x = 0;
start.y = 0;
goal.x = n-1;
goal.y = m-1;
int head, tail; // 队头 队尾
int x, y, xx, yy; // x,y是当前坐标 xx,yy是下一步的坐标
head = 0;
path[0].x = start.x;
path[0].y = start.y;
pre[0] = -1;
vis[start.x][start.y] = true;
tail = 1; // 起点入队
while(head < tail){ // 如果队列不为空
x = path[head].x;
y = path[head].y;
if(x == goal.x && y == goal.y){
Print(head); // 走到终点 打印最短路径
return;
}
for(int i = 0; i < 4; i++){
xx = x + dirx[i];
yy = y + diry[i];
if(xx >= 0 && xx < n && yy >= 0 && yy < m && maze[xx][yy] == 0 && !vis[xx][yy]){
vis[xx][yy] = true;
path[tail].x = xx;
path[tail].y = yy;
pre[tail] = head;
tail++; // 当前坐标入队
}
}
head++; // 四个方向都走过后元素出队
}
}
int main(){
Input();
bfs();
return 0;
}
还有一个使用queue的版本,来自网络:
http://m.blog.csdn.net/blog/yzj577/37997073
版权声明:本文为博主原创文章,未经博主允许不得转载。