简单的迷宫
时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte
总提交:27 测试通过:12
总提交:27 测试通过:12
描述
睁开眼睛,Bob发现自己被困在一个迷宫里了,是做梦么…
不管那么多了,还是先离开为妙。不过由于恐惧,Bob希望找到一条从入口到出口的最短路径,你能帮帮他么?
这个迷宫相当简单,它是一个N*M的矩形区域,每个格点可以通向相邻上下左右四个格点,起点为(1,1),终点为(N,M)。除此之外,迷宫内还有K个点为障碍点,表示他们不可到达,但障碍点不会出现在起点和终点。输入
组数据输入。
每组数据,第一行N,M,K, 2<=N,M<=50,0<=k<=N*M-2,
接下来k行,每行两个整数xi,yi,表示第i个障碍物的坐标,障碍物之间不会重复,坐标均1<=xi<=N,1<=yi<=M;
输出
每组数据输出一个整数,最短路径长度,如果Bob不能到达终点,则输出-1;
样例输入
5 5 8
4 3
4 5
5 2
2 2
1 5
3 3
5 1
1 4
5 5 8
1 2
2 2
3 2
4 2
2 4
3 4
4 4
5 4
样例输出
8
16
题目链接 :http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1793
题目分析 :最简单的走迷宫,要求最短路,所以用BFS搜索
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int const MAX = 55;
int map[MAX][MAX];
int vis[MAX][MAX];
int dirx[4] = {1,-1,0,0}; //四个方向
int diry[4] = {0,0,-1,1};
int n, m, k;
struct Point
{
int x, y;
int step;
};
int BFS()
{
memset(vis,0,sizeof(vis)); //初始化vis
queue<Point> q;
Point node, t;
node.x = 1;
node.y = 1;
node.step = 0;
vis[1][1] = 1;
q.push(node); //将起点压入队列
while(!q.empty()) //队列非空时执行操作
{
node = q.front(); //接收队首元素
q.pop(); //队首出队
for(int i = 0; i < 4; i++) //向四个方向走
{
t = node;
t.x += dirx[i];
t.y += diry[i];
t.step++;
if(t.x == n && t.y == m) //到达终点返回步数
return t.step;
//判断该点的可行性
if(t.x < 1 || t.x > n || t.y < 1 || t.y > n || !map[t.x][t.y] || vis[t.x][t.y])
continue;
//可行则标记为已访问,该点如队列
else
{
vis[t.x][t.y] = 1;
q.push(t);
}
}
}
return -1;
}
int main()
{
int xi, yi;
while(scanf("%d %d %d",&n, &m, &k) != EOF)
{
memset(map,1,sizeof(map));
for(int i = 0; i < k; i++)
{
scanf("%d %d",&xi, &yi);
map[xi][yi] = 0;
}
printf("%d\n", BFS());
}
}

本文介绍了一个使用广度优先搜索(BFS)算法解决迷宫最短路径问题的经典案例。迷宫由N*M网格构成,存在多个障碍点,起点位于(1,1),终点位于(N,M)。文章提供了完整的C++实现代码,并详细解释了BFS算法的应用。
670

被折叠的 条评论
为什么被折叠?



