DFS+BFS(POJ3083)
题目链接:http://poj.org/problem?id=3083
解题报告:这个题目,搜最短路,没有什么问题。优先走左边,走右边,有很多说法,思路大概都相同,都是记录当前朝向,根据数学公式(i+j+3)%4计算下一个方向,但是小草发现有些博客里面有一点点小错误,就是在方向的表示上。
左边优先,上右下左分别为0、1、2、4。dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
右边优先,左下右上分别为0、1、2、3。dir[4][2]={{0,-1},{1,0},{0,1},{-1,0}};

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue> using namespace std; #define MAXN 1000000007
#define judge(x,y) x>=0&&x<m&&y>=0&&y<n&&map[x][y]!='#'&&!vis[x][y] int dir1[][]= {{-,},{,},{,},{,-}}; ///左边优先
int dir2[][]= {{,-},{,},{,},{-,}}; ///右边优先 char map[][];
bool vis[][]; int m,n; struct node
{
int x,y;
int dist;
}; int step,START_I;
int left_step=,right_step=; int DFS(int x,int y,int I,int di[][])
{
if(map[x][y]=='E') return ;
int i,j;
for(j=; j<; j++)
{
i=(I+j+)%;
if(judge(x+di[i][],y+di[i][]))
{
step=DFS(x+di[i][],y+di[i][],i,di)+;
break;
}
}
return step;
} int bfs(int x,int y)
{
memset(vis,,sizeof(vis));
queue<node> q;
node u;
u.x=x;
u.y=y;
u.dist=;
vis[u.x][u.y]=true;
q.push(u);
while(!q.empty())
{
u=q.front();
int d=u.dist;
if(map[u.x][u.y]=='E')
return u.dist;
q.pop();
for(int i=; i<; i++)
{
node v;
v.x=u.x+dir1[i][];
v.y=u.y+dir1[i][];
if(judge(v.x,v.y))
{
vis[v.x][v.y]=true;
v.dist=d+;
q.push(v);
}
}
}
return ;
} int main()
{
int cas;
scanf("%d",&cas);
while(cas--)
{
memset(map,,sizeof(map));
memset(vis,,sizeof(vis)); scanf("%d%d",&n,&m);
int sx,sy; ///开始的坐标 for(int i=; i<m; i++)
{
scanf("%s",map[i]);
for(int j=; j<n; j++)
if(map[i][j]=='S') sx=i,sy=j;
} ///一直向左走时,先找到出口的方向
for(int i=; i<; i++)
if(judge(sx+dir1[i][],sy+dir1[i][])) ///从这个点搜四边,是否有出口,并且记录下来出口,上右下左分别为0,1,2,3,
START_I=i; ///(i+j+3)%4
step=;
left_step=DFS(sx,sy,START_I,dir1); ///向右
for(int i=; i<; i++)
if(judge(sx+dir2[i][],sy+dir2[i][])) ///从这个点搜四边,是否有出口,并且记录下来出口,左下右上分别为0,1,2,3,
START_I=i; ///(i+j+3)%4
step=;
memset(vis,,sizeof(vis));
right_step=DFS(sx,sy,START_I,dir2);
printf("%d %d %d\n",left_step,right_step,bfs(sx,sy)+);
}
return ;
}
DFS+BFS(POJ3083)的更多相关文章
- ACM/ICPC 之 靠墙走-DFS+BFS(POJ3083)
//POJ3083 //DFS求靠左墙(右墙)走的路径长+BFS求最短路 //Time:0Ms Memory:716K #include<iostream> #include<cst ...
- DFS/BFS+思维 HDOJ 5325 Crazy Bobo
题目传送门 /* 题意:给一个树,节点上有权值,问最多能找出多少个点满足在树上是连通的并且按照权值排序后相邻的点 在树上的路径权值都小于这两个点 DFS/BFS+思维:按照权值的大小,从小的到大的连有 ...
- 【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)
[题目链接:NYOJ-58] 经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的. 不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点. 我想,因 ...
- ID(dfs+bfs)-hdu-4127-Flood-it!
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4127 题目意思: 给n*n的方格,每个格子有一种颜色(0~5),每次可以选择一种颜色,使得和左上角相 ...
- [LeetCode] 130. Surrounded Regions_Medium tag: DFS/BFS
Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'. A reg ...
- HDU 4771 (DFS+BFS)
Problem Description Harry Potter has some precious. For example, his invisible robe, his wand and hi ...
- DFS/BFS视频讲解
视频链接:https://www.bilibili.com/video/av12019553?share_medium=android&share_source=qq&bbid=XZ7 ...
- POJ 3083 -- Children of the Candy Corn(DFS+BFS)TLE
POJ 3083 -- Children of the Candy Corn(DFS+BFS) 题意: 给定一个迷宫,S是起点,E是终点,#是墙不可走,.可以走 1)先输出左转优先时,从S到E的步数 ...
- [LeetCode]695. 岛屿的最大面积(DFS/BFS)、200. 岛屿数量(DFS/BFS待做/并差集待做)
695. 岛屿的最大面积 题目 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合.你可以假设二维矩阵的四个边缘都被 ...
随机推荐
- Wireshark抓包数据:理解与分析
wireshark是一个非常好用的抓包工具,本文根据平时抓包经验,对之前wireshark抓包的一些常见知识点进行了整理. 有不当之处,欢迎指正 1.SYN,FIN会消耗一个序号,单独的ACK不消耗序 ...
- Problem01 不死神兔
题目:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析:兔子的规律为数列1,1,2,3,5,8,13,21 ...
- ORACLE这门武功
今天不是一个什么特别的日子,只是有些感触,特别是工作上的,所以就想记一变复杂的心情.有句话说:"人到中年不如狗",我不知道我现在的状况是不如狗,还是比狗好一点.但至少心情部复杂的. ...
- SpringMVC中RequetContextListener
来自:https://www.cnblogs.com/softidea/p/7068196.html 零.引言 RequetContextListener从名字结尾Listener来看就知道属于监听器 ...
- notepad++查看Log
安装步骤:打开notepad++,插件→ Plugin Manager→ Show Plugin Manager→ Avaliable→ 等待插件列表刷新出来后,选中Android Logger插件→ ...
- Jenkins+Ant+Jmeter接口自动化集成测试
一.Jmeter+ant 1.首先我们默认Jmeter脚本已经录制好了,并测试通过,存在(查询模块.jmx)脚本 2.将JMeter所在目录下extras子目录里的ant-JMeter-1.1.1.j ...
- C++有关拷贝构造函数(默认/浅/深拷贝构造函数)
拷贝结构函数顾名思义就是复制对象. 先讲一下默认拷贝函数: 默认拷贝就是直接赋值,让程序调用默认拷贝结构函数. Student p1; Student p2 = p1//或者Student p2(p1 ...
- java 多线程 yield方法的意义
Thread.yield( )方法: 使当前线程从执行状态(运行状态)变为可执行态(就绪状态).cpu会从众多的可执行态里选择,也就是说,当前也就是刚刚的那个线程还是有可能会被再次执行到的,并不是说一 ...
- pat1016. Phone Bills (25)
1016. Phone Bills (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A long-di ...
- Javascript 学习 Boolean
构造函数 new Boolean(value) //构造函数 Boolean(value) //转换函数 参数 value 由布尔对象存放的值或者要转换成布尔值的值 返回值 当作为一个构造函数(带有运 ...