【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)
【题目链接:NYOJ-58】
经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的。
不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点。
我想,因为广搜需要的就是队列,所以相比递归队列更耗内存?

当然DFS并不像上图所说,需要用栈,而是运用递归即可。
BFS:

因为BFS是要一个接一个的遍历,所以用到了结构体,来保存坐标和当前所走步数
1.每走一步,通过定义的结构体,从队列中提取a(即上一步的坐标、步数(步数每次累加))
2.在a的基础上进行对a周围四个方向进行判断,找出可以继续走的位置(即非障碍、边界),并将该位置的坐标,进入队列中
继续走下一步时,循环以上1.2两步操作
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int dir[][]= {,,-,,,,,-};
struct point{
int x,y,step;
};
int bfs(point s,point e,int map[][]){
queue<point>tp;//自定义类型的队列
int i;
point t;//保存当前坐标 ,临时变量
//s表示之前
//e表示目标
s.step=;//保存步数
map[s.x][s.y]=;//标记此处已经走过
tp.push(s);//初始化队列 ,s中(x,y)初始为起始坐标,step = 0
while(!tp.empty()){//循环直至队列为空
s=tp.front();//每次循环s都等于队首
tp.pop();//删除队首
if(s.x==e.x&&s.y==e.y)//如果当前坐标与目标坐标相等
return s.step; //返回当前的步数
//遍历四个不同的方向
//如果是通道(0),即增加步数
for(int i=; i<; i++){
t.x=s.x+dir[i][];
t.y=s.y+dir[i][];
if(map[t.x][t.y]==){//如果是通道
t.step=s.step+;
map[t.x][t.y]=;//标记此处已经走过,及标记为墙
tp.push(t);
}
}
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
point s,e;
int map[][]= {,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,};
scanf("%d%d%d%d",&s.x,&s.y,&e.x,&e.y);
printf("%d\n",bfs(s,e,map));
}
return ;
}
DFS:
DFS就没什么好说了,不明白可以看看之前的DFS博客
只不过这里,没有用到单独的二维数组see[][],来判断本个坐标是已经搜索过
而是结合题意,把当前所在位置变为'1',即障碍、边界,那么在递归往下延伸判断四周时,达到同样的目的
当然在DFS函数最后,需要把Map[][]重新变为'0',因为递归执行的顺序是自上而下再从下向上返回
因为是多组测试数据,所以需要在递归返回时,把迷宫“恢复原貌”
#include<iostream>
using namespace std;
#define min(a,b) a < b ? a : b
int Map[][] = {,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,};
int a,b,c,d,num;
void dfs(int x,int y,int s){
if(Map[x][y]) return;
if(x == c && y == d){
num = min(s,num);
return;
}
s++;
Map[x][y] = ;
dfs(x - ,y,s);
dfs(x + ,y,s);
dfs(x,y - ,s);
dfs(x,y + ,s);
Map[x][y] = ;
}
int main(){
int n;
cin >> n;
while(n--){
num = ;
cin >> a >> b >> c >> d;
dfs(a,b,);
cout << num << endl;
}
return ;
}
DFS,BFS讲解PPT:click here || there
【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)的更多相关文章
- NYOJ 58 最少步数
最少步数 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 这有一个迷宫,有0~8行和0~8列: 1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 ...
- nyoj 1022 最少步数【优先队列+广搜】
最少步数 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 这有一个迷宫,有0~8行和0~8列: 1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 ...
- ny 58 最少步数 (BFS)
题目:http://acm.nyist.net/JudgeOnline/problem.php?pid=58 就是一道简单的BFS 练习练习搜索,一次AC #include <iostream& ...
- 南阳理工 58 最少步数 (DFS)
描述 这有一个迷宫,有0~8行和0~8列: 1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 1,0,0,1,1,0,0,0,1 1,0,1,0,1,1,0,1,1 1,0,0, ...
- NYOJ 53 最少步数
题 目 http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=58 思路借鉴 DFS-Deep First Search-深度优先 ...
- POJ 3083 -- Children of the Candy Corn(DFS+BFS)TLE
POJ 3083 -- Children of the Candy Corn(DFS+BFS) 题意: 给定一个迷宫,S是起点,E是终点,#是墙不可走,.可以走 1)先输出左转优先时,从S到E的步数 ...
- 最少步数(dfs + bfs +bfs优化)
最少步数 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 这有一个迷宫,有0~8行和0~8列: 1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 ...
- 最少步数(bfs)
最少步数 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 这有一个迷宫,有0~8行和0~8列: 1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 ...
- nyist 58 最小步数 BFS
最少步数 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 这有一个迷宫,有0~8行和0~8列: 1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 1,0 ...
随机推荐
- VS2010字体设置+推荐字体
字体的设置在工具->选项->环境->字体和颜色. 相信大家在用VS2010的时候都会觉得默认的字体不是很好看,尤其是看的时间长了以后,更是累眼睛,这里推荐一个字体,个人感觉像是加粗加 ...
- Chp18: Hard
18.1 Write a function that adds two numbers. You should not use + or any arithmetic operators. Solut ...
- POJ 2155 Matrix (二维线段树入门,成段更新,单点查询 / 二维树状数组,区间更新,单点查询)
题意: 有一个n*n的矩阵,初始化全部为0.有2中操作: 1.给一个子矩阵,将这个子矩阵里面所有的0变成1,1变成0:2.询问某点的值 方法一:二维线段树 参考链接: http://blog.csdn ...
- .net中的认证(authentication)与授权(authorization)
“认证”与“授权”是几乎所有系统中都会涉及的概念,通俗点讲: 1.认证(authentication) 就是 "判断用户有没有登录?",好比windows系统,没登录就无法使用(不 ...
- POJ 4044 Score Sequence
题目链接 题意 :给你两个序列,进行降序排序,找出连续的公共子序列,将这个子序列输出,然后对个位数升序排序,如果个位数相同就按数的大小排,再输出这个新排好的. 思路 :先排序,再找公共子序列,最后个位 ...
- [转]Java数组初始化详解
一维数组1) int[] a; //声明,没有初始化 2) int[] a=new int[5]; //初始化为默认值,int型为0 3) int[] a={1,2,3,4,5}; ...
- 网络上下载的Ghost系统含威胁
- Executing Raw SQL Queries using Entity Framework
原文 Executing Raw SQL Queries using Entity Framework While working with Entity Framework developers m ...
- *EditPlus注册码在线生成
http://www.jb51.net/tools/editplus/
- Bitmap 和Drawable 的区别
Bitmap - 称作位图,一般位图的文件格式后缀为bmp,当然编码器也有很多如RGB565.RGB888.作为一种逐像素的显示对象执行效率高,但是缺点也很明显存储效率低.我们理解为一种存储对象比较好 ...