【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 ...
随机推荐
- Codeforces Round #363 (Div. 2)->C. Vacations
C. Vacations time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
- PAT-乙级-1048. 数字加密(20)
1048. 数字加密(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求实现一种数字加密方法.首先固 ...
- Linux 操作Mysql详解
一.引言 想使用Linux已经很长时间了,由于没有硬性任务一直也没有系统学习,近日由于工作需要必须使用Linux下的MySQL.本以为有 Windows下使用SQL Server的经验,觉得在Linu ...
- uva 10994
一开始想法太简单 错了好多遍 #include <cstdio> #include <cstdlib> #include <cmath> #include < ...
- poj 3170
两遍bfs ~ #include <cstdio> #include <cstdlib> //#include <cmath> #include <map&g ...
- POJ 3228 Gold Transportation(带权并查集,好题)
参考链接:http://www.cnblogs.com/jiaohuang/archive/2010/11/13/1876418.html 题意:地图上某些点有金子,有些点有房子,还有一些带权路径,问 ...
- D&F学数据结构系列——二叉堆
二叉堆(binary heap) 二叉堆数据结构是一种数组对象,它可以被视为一棵完全二叉树.同二叉查找树一样,堆也有两个性质,即结构性和堆序性.对于数组中任意位置i上的元素,其左儿子在位置2i上,右儿 ...
- gulp下livereload和webserver实现本地服务器下文件自动刷新
一.前言 node从v0.10.26升级(为了匹配autoprefixer)到v5.3.0后出现了gulp插件兼容问题,在nodejs下各种新的插件出现问题,需要重新配置.livereload实现ch ...
- c/c++优秀博文
C进阶指南(1):整型溢出和类型提升.内存申请和管理 http://blog.jobbole.com/72830/ 软件开发中应避免的10个问题
- seafile安装日志(非教程)
需要的软件: python 2.7.x(从 Seafile 5.1 开始,python 版本最低要求为2.7) python-setuptools python-imaging python-mysq ...