【题目链接: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-最少步数(迷宫最短路径问题)的更多相关文章

  1. 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 ...

  2. 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 ...

  3. ny 58 最少步数 (BFS)

    题目:http://acm.nyist.net/JudgeOnline/problem.php?pid=58 就是一道简单的BFS 练习练习搜索,一次AC #include <iostream& ...

  4. 南阳理工 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, ...

  5. NYOJ 53 最少步数

    题      目    http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=58 思路借鉴   DFS-Deep First Search-深度优先 ...

  6. POJ 3083 -- Children of the Candy Corn(DFS+BFS)TLE

    POJ 3083 -- Children of the Candy Corn(DFS+BFS) 题意: 给定一个迷宫,S是起点,E是终点,#是墙不可走,.可以走 1)先输出左转优先时,从S到E的步数 ...

  7. 最少步数(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 ...

  8. 最少步数(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 ...

  9. 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 ...

随机推荐

  1. 在线最优化求解(Online Optimization)之四:RDA

    在线最优化求解(Online Optimization)之四:RDA 不论怎样,简单截断.TG.FOBOS都还是建立在SGD的基础之上的,属于梯度下降类型的方法,这类型方法的优点就是精度比较高,并且T ...

  2. PHP防止SQL注入与几种正则表达式讲解

    注入漏洞代码和分析 代码如下: <?php function customerror($errno, $errstr, $errfile, $errline) {     echo <b& ...

  3. cf 359A 359B

    359A 如果有点在边上则最少两次 没有则最少操作4次 #include <cstdio> #include <cstring> #include <algorithm& ...

  4. 关于去哪儿网的UI自动化测试脚本(Python实现)

    UI自动化测试Qunar机票搜索场景访问Qunar机票首页http://flight.qunar.com,选择“单程”,输入出发.到达城市,选择today+7日后的日期,点“搜索”,跳转到机票单程搜索 ...

  5. hdu 1271 整数对

    看了别人的解题报告a了, 大致思路就是 A=a+b*10^k+c*10^(k+1) B=a+c*10^k (在A中取出一位数后) N=A+B=2*a+b*10^k+11*c*10^k 这样就好做了,再 ...

  6. IE11兼容IE9问题

    注意如果<head>标签里加<meta http-equiv="X-UA-Compatible"content="IE=EmulateIE9" ...

  7. 欧拉工程第60题:Prime pair sets

    题目链接 五个数,任意两个数的任意链接后的数还是质数 满足这个条件的最小五个数的和是多少? 结果:26033 纯暴力破解: package projecteuler51to60; import jav ...

  8. lintcode:Singleton 单例

    题目: 单例 单例是最为最常见的设计模式之一.对于任何时刻,如果某个类只存在且最多存在一个具体的实例,那么我们称这种设计模式为单例.例如,对于 class Mouse (不是动物的mouse哦),我们 ...

  9. 【nginx运维基础(5)】Nginx的location攻略

    概述 location 有"定位"的意思, 根据Uri来进行不同的定位. 在虚拟主机的配置中,是必不可少的,location可以把网站的不同部分,定位到不同的处理方式上.伪静态,反 ...

  10. Java学习笔记之:Java流程控制

    一.介绍 Java流程控制包括顺序控制.条件控制和循环控制. 顺序控制,就是从头到尾依次执行每条语句操作.条件控制,基于条件选择执行语句,比方说,如果条件成立,则执行操作A,或者如果条件成立,则执行操 ...