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 (代表土地) 构成的组合.你可以假设二维矩阵的四个边缘都被 ...
随机推荐
- js模仿微信语音播放的小功能
自己写的一个模仿微信语音播放的小功能,实现的主要功能是:点击播放,点击暂停,播放切换,,, 代码如下: <!DOCTYPE html> <html lang="en&qu ...
- Appium自动化中截图的问题
在用Appium做UI自动化过程中,大家会发现测试报告很重要,而在测试报告中截图很重要. 因为很多公司都是用Jenkins作为持续集成工具,所以要让执行自动化测试的人看明白自动化在跑什么,哪里失败了, ...
- ajax动态给select赋值
<select name="elements" id="ele" style="width: 145px;"> ...
- STM32F3 浮点运算使用
在keil中使用浮点运算的步骤:在程序中包含#include <math.h>
- Unity 组件.name
组件.name 指的是组件所在游戏对象的名字,例如: Animation m_animation; m_animation =GetComponent<Animation>(); m_a ...
- SSM项目spring配置文件详细步骤(分门别类、灵巧记忆)
spring-dao.xml文件 1.配置外部db.property文件: <context:property-placeholder location="classpath:jdbc ...
- stm32 外部中断学习
今天我们看看STM32的外部中断实验. STM32 供 IO 口使用的中断线只有 16 个,但是 STM32 的 IO 口却远远不止 16 个,那么 STM32 是怎么把 16 个中断线和 IO 口一 ...
- vsftpd配置文件详解 ---配置解说
vsftpd配置文件详解 1.默认配置: 1>允许匿名用户和本地用户登陆. anonymous_enable=YES local_enable=YES 2>匿名 ...
- BoostrapTable-本地模式(一次性加在所有数据)
直接上代码 数据: [ { "id": "1001", "name": "yyq", "isAdmin&quo ...
- 使用cookie的注意事项
一.什么是cookie? Cookie(复数形态Cookies),中文名称为小型文本文件或小甜饼[1],指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密) ...