迷宫,较为高效的C++代码 BFS实现
2012-04-05 15:04
609 查看
同样的BFS,这种方法相对内存占用较小。
复制别人的代码,学习了!
题目描述:
sun所在学校每年都要举行电脑节,今年电脑节有一个新的趣味比赛项目叫做闯迷宫。
sun的室友在帮电脑节设计迷宫,所以室友就请sun帮忙计算下走出迷宫的最少步数。
知道了最少步数就可以辅助控制比赛难度以及去掉一些没有路径到达终点的map。
比赛规则是:从原点(0,0)开始走到终点(n-1,n-1),只能上下左右4个方向走,只能在给定的矩阵里走。
输入:
输入有多组数据。
每组数据输入n(0<n<=100),然后输入n*n的01矩阵,0代表该格子没有障碍,为1表示有障碍物。
注意:如果输入中的原点和终点为1则这个迷宫是不可达的。
输出:
对每组输入输出该迷宫的最短步数,若不能到达则输出-1。
样例输入:
样例输出:
复制别人的代码,学习了!
题目描述:
sun所在学校每年都要举行电脑节,今年电脑节有一个新的趣味比赛项目叫做闯迷宫。
sun的室友在帮电脑节设计迷宫,所以室友就请sun帮忙计算下走出迷宫的最少步数。
知道了最少步数就可以辅助控制比赛难度以及去掉一些没有路径到达终点的map。
比赛规则是:从原点(0,0)开始走到终点(n-1,n-1),只能上下左右4个方向走,只能在给定的矩阵里走。
输入:
输入有多组数据。
每组数据输入n(0<n<=100),然后输入n*n的01矩阵,0代表该格子没有障碍,为1表示有障碍物。
注意:如果输入中的原点和终点为1则这个迷宫是不可达的。
输出:
对每组输入输出该迷宫的最短步数,若不能到达则输出-1。
样例输入:
2 0 1 0 0 5 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 1 1 1 0 1 0 1 0 0
样例输出:
2 8
#include<stdio.h> #include<queue> #define INF 0x7fffffff using namespace std; struct S { int x, y; S(int i, int j) { x = i, y = j; } }; int M[102][102], D[102][102], n, i, j, t; int main() { while (~scanf("%d", &n)) { for (i = 0; i < n; ++i) for (j = 0; j < n; ++j) D[i][j] = INF,scanf("%d", &M[i][j]); queue<S> r; --n; if (M[0][0] || M ) { puts("-1"); continue; } r.push(S(0, 0)); D[0][0] = 0; while (!r.empty()) { i = r.front().x, j = r.front().y; r.pop(); t = D[i][j] + 1; if (i - 1 >= 0 && !M[i - 1][j] && D[i - 1][j] > t) D[i - 1][j] = t, r.push(S(i - 1, j)); if (j - 1 >= 0 && !M[i][j - 1] && D[i][j - 1] > t) D[i][j - 1] = t, r.push(S(i, j - 1)); if (i + 1 <= n && !M[i + 1][j] && D[i + 1][j] > t) D[i + 1][j] = t, r.push(S(i + 1, j)); if (j + 1 <= n && !M[i][j + 1] && D[i][j + 1] > t) D[i][j + 1] = t, r.push(S(i, j + 1)); } if (D >= INF) D = -1; printf("%d\n", D ); } }
相关文章推荐
- C++ 迷宫游戏实现代码
- 图的俩种遍历方式(DFS,BFS)C++代码实现
- 经典算法<一>迷宫问题 3.多条路径 BFS求解 C++实现
- 经典算法<一>迷宫问题 2.单条路径 BFS求解 C++实现
- BFS和DFS求最短路径的C++代码实现
- c++代码实现图的BFS遍历
- 复数四则运算-c++代码实现及运行实例结果
- 责任链模式的c++代码实现
- 复数乘法运算(三次实数乘法)-c++代码实现及运行实例结果
- C++编写代码实现任意位数的水仙花判定
- 【编程题目】数值的整数次方——关于代码完整性及错误处理方式的探讨(C++实现)
- 使用 gperf 实现高效的 C/C++ 命令行处理
- 雇佣问题原址排列给定数组(randomize In Place)-c++代码实现及运行实例结果
- 螺旋队列C++代码实现实例及运行结果
- 生日悖论扩展引申1-c++代码实现及运行实例结果
- 生日悖论扩展引申2-c++代码实现及运行实例结果
- 图的dfs与bfs(深搜广搜)c++实现
- ffmpeg代码分析之2——模拟C++多态之C实现篇章
- c++实现的一种代码膨胀变形壳
- 【图像特征提取12】OpenCv的SIFT图像局部特征提取描述算法C++代码的实现