题意:给一个w*h的迷宫,其中矩阵里面 S是起点,E是终点,“#”不可走,“.”可走,而且,S、E都只会在边界并且,不会在角落,例如(0,0),输出的话,每组数据就输出三个整数,第一个整数,指的是,以S的起点为当前所对着的路径为正方向,如果正方向的左边能走的话,就走左边,不能就按正方向走,不行的话就就往回走,如此反复,记录步数,并输出,第二个整数也是如此,只不过搜的方向改成正方向的右边。第三个就是最短路,

分析:前两个用DFS求出,最短路直接BFS解决,,

单就沿着左走看一下:

当前方向       检索顺序

Sx=n-1   ↑ :      ← ↑ → ↓

Sy=0    → :        ↑ → ↓ ←

Sx=0    ↓ :      → ↓ ← ↑

Sy=n-1   ← :        ↓ ← ↑ →

如此,规律很明显,假设数组存放方向为 ← ↑ → ↓, 如果当前方向为 ↑, 就从 ← 开始依次遍历,找到可以走的,如果 ← 可以走,就不用再看 ↑ 了。

这个题的麻烦处理就在于怎么按什么样的顺序dfs

在网上搜题解感觉这种想法特别好,不繁琐,代码还简洁

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<queue> using namespace std; int dx[]={,-,,};
int dy[]={-,,,}; int dl[][]={{,-},{-,},{,},{,}};
int dr[][]={{,},{-,},{,-},{,}}; int sx,sy,ex,ey,n,m;
char G[][]; struct node
{
int x,y,s;
}; int dfs(int x,int y,int d,int step,int dir[][])
{
for(int i=;i<;++i)
{
int j=((d-+)%+i)%;
int nx=x+dir[j][];
int ny=y+dir[j][];
if(nx==ex&&ny==ey)
return step+;
if(nx<||ny<||nx>n||ny>m||G[nx][ny]=='#')
continue;
return dfs(nx,ny,j,step+,dir);
}
} int BFS(int sx,int sy)
{
bool vis[][];
memset(vis, false, sizeof(vis));
queue<node>q;
node a;
a.x=sx,a.y=sy,a.s=;
q.push(a);
vis[sx][sy]=true;
while(!q.empty())
{
node p=q.front();
q.pop();
if(p.x==ex&&p.y==ey)
return p.s;
node p1;
for(int i=;i<;++i) {
p1.x=p.x+dx[i];
p1.y=p.y+dy[i];
p1.s=p.s+;
if(p1.x<||p1.x>n||p1.y<||p1.y>m||vis[p1.x][p1.y])
continue;
if(G[p1.x][p1.y]!='#')
{
vis[p1.x][p1.y]=true;
q.push(p1);
}
}
}
return -;
} int main()
{
int T,d1,d2;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&m,&n);
for(int i=;i<n;++i)
{
scanf("%s",G[i]);
for(int j=;j<m;++j)
{
if(G[i][j]=='S')
{
sx=i;
sy=j;
}
else if(G[i][j]=='E')
{
ex=i;
ey=j;
}
}
}
if(sx==)
{
d1=;
d2=;
}
else if(sx==n-)
{
d1=;
d2=;
}
else if(sy==)
{
d1=;
d2=;
}
else if(sy==m-)
{
d1=;
d2=;
}
printf("%d ",dfs(sx,sy,d1,,dl));
printf("%d ",dfs(sx,sy,d2,,dr));
printf("%d\n",BFS(sx,sy));
}
return ;
}

POJ3083 Children of the Candy Corn(Bfs + Dfs)的更多相关文章

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

    Description The cornfield maze is a popular Halloween treat. Visitors are shown the entrance and mus ...

  2. POJ3083 Children of the Candy Corn(搜索)

    题目链接. 题意: 先沿着左边的墙从 S 一直走,求到达 E 的步数. 再沿着右边的墙从 S 一直走,求到达 E 的步数. 最后求最短路. 分析: 最短路好办,关键是沿着墙走不太好想. 但只要弄懂如何 ...

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

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

  4. POJ3083——Children of the Candy Corn(DFS+BFS)

    Children of the Candy Corn DescriptionThe cornfield maze is a popular Halloween treat. Visitors are ...

  5. poj3083 Children of the Candy Corn BFS&&DFS

    Children of the Candy Corn Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11215   Acce ...

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

    Children of the Candy Corn Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9311 Accepted: ...

  7. poj 3083 Children of the Candy Corn(DFS+BFS)

    做了1天,总是各种错误,很无语 最后还是参考大神的方法 题目:http://poj.org/problem?id=3083 题意:从s到e找分别按照左侧优先和右侧优先的最短路径,和实际的最短路径 DF ...

  8. poj3083 Children of the Candy Corn 深搜+广搜

    这道题有深搜和广搜.深搜还有要求,靠左或靠右.下面以靠左为例,可以把简单分为上北,下南,左西,右东四个方向.向东就是横坐标i不变,纵坐标j加1(i与j其实就是下标).其他方向也可以这样确定.通过上一步 ...

  9. poj 3083 Children of the Candy Corn (广搜,模拟,简单)

    题目 靠墙走用 模拟,我写的是靠左走,因为靠右走相当于 靠左走从终点走到起点. 最短路径 用bfs. #define _CRT_SECURE_NO_WARNINGS #include<stdio ...

随机推荐

  1. 有关Datatabled的合并,排序和删除重复行的方法

    当某些操作需要涉及合并Datatable时,我们应该如何操作呢? 下面是自己总结的一些方法: 当有两表dt1和dt2的时候,使用dt1.Merge(dt2) 可以将表1表2中相同的合并在一起 排序方法 ...

  2. Android+ESP8266+路由器实现远程控制(基于花生壳域名方式访问)

    x先说一下实现的功能,其实就是远程控制 和这篇文章的控制  http://www.cnblogs.com/yangfengwu/p/5295632.html   应该说是这篇文章的升级,解决这篇文章由 ...

  3. LeetCode 538. Convert BST to Greater Tree (把二叉搜索树转换成较大树)

    Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original B ...

  4. python学习笔记(十一)之函数

    牛刀小试: 定义一个无参函数 >>> def myFirstFunc(): ... print("Hello python") ... print("h ...

  5. 基于HTML5 Canvas的3D动态Chart图表

    发现现在工业SCADA上或者电信网管方面用图表的特别多,虽然绝大部分人在图表制作方面用的是echarts,他确实好用,但是有些时候我们不能调用别的插件,这个时候就得自己写这些美丽的图表了,然而图表轻易 ...

  6. A strange lift

    Problem Description There is a strange lift.The lift can stop can at every floor as you want, and th ...

  7. visual filters 滤镜 ie

    滤镜ie9开始就废弃了,用来对ie4-8实现一些多媒体动画之类的效果.可以添加到标准的HTML控件上,例如text,图片   包含:1.界面滤镜  (Procedural Surfaces)2.静态滤 ...

  8. Spring+MyBatis+SpringMvc整合Demo

    客户关系管理系统demo 项目分析 该demo使用技术及环境:ssm+maven+bootstrap+jsp+mysql+idea+jdk1.8 需求:客户管理,实现客户列表分页显示如下图 项目开始 ...

  9. Breadth-first search 算法(Swift版)

    在讲解Breadth-first search 算法之前,我们先简单介绍两种数据类型Graph和Queue. Graph 这就是一个图,它由两部分组成: 节点, 使用圆圈表示的部分 边, 使用线表示的 ...

  10. MVC 页面静态化

    最近工作需要,实现页面静态化,以前在ASP时代,都是FSO自己手动生成的. 新时代,MVC了,当然也要新技术,网上一搜,找到一种解决方案,是基于MVC3的,实现原理是通过mvc提供的过滤器扩展点实现页 ...