POJ:3083 Children of the Candy Corn(bfs+dfs)
http://poj.org/problem?id=3083
Description
One popular maze-walking strategy guarantees that the visitor will eventually find the exit. Simply choose either the right or left wall, and follow it. Of course, there's no guarantee which strategy (left or right) will be better, and the path taken is seldom the most efficient. (It also doesn't work on mazes with exits that are not on the edge; those types of mazes are not represented in this problem.)
As the proprieter of a cornfield that is about to be converted into a maze, you'd like to have a computer program that can determine the left and right-hand paths along with the shortest path so that you can figure out which layout has the best chance of confounding visitors.
Input
Exactly one 'S' and one 'E' will be present in the maze, and they will always be located along one of the maze edges and never in a corner. The maze will be fully enclosed by walls ('#'), with the only openings being the 'S' and 'E'. The 'S' and 'E' will also be separated by at least one wall ('#').
You may assume that the maze exit is always reachable from the start point.
Output
Sample Input
2
8 8
########
#......#
#.####.#
#.####.#
#.####.#
#.####.#
#...#..#
#S#E####
9 5
#########
#.#.#.#.#
S.......E
#.#.#.#.#
#########
Sample Output
37 5 5
17 17 9
题意:有一个迷宫,#代表墙,. 代表能走,S是起点,E是终点,M为宽,列数N为高;
先输出左转优先时,从S到E的步数(DFS)
再输出右转优先时,从S到E的步数(DFS)
最后输出S到E的最短步数(BFS)
题目解析:
之前一直没读懂题意,之后读懂了,却一直不会写,看了一下大神写的题解(汗颜啊),这题就是代码有点长,
但数据水,0MS,282kb。一遍就A了,如果用dfs求最短路,估计会超时,没有尝试。
左优先时,
依左上右下的顺时针方向走。根据上一个来的方向判断当前坐标开始走的方向 右优先时,
依右上左下的逆时针方向走。根据上一个来的方向判断当前坐标开始走的方向,可以走四个方向,最后才走当前位置的对面方向。
我是假设向下是0,向上是1,向右是2,向左是3,
左优先时,当前位置如果是向左,那么下一步依次走下,左,上,右。 (*)左边、右边优先搜索都不是找最短路,因此走过的路可以再走,无需标记走过的格
分析:
最短路好办,关键是沿着墙走不太好想。
但只要弄懂如何转,这题就容易了。
单就沿着左走看一下:
当前方向 检索顺序
↑ : ← ↑ → ↓
→ : ↑ → ↓ ←
↓ : → ↓ ← ↑
← : ↓ ← ↑ →
如此,规律很明显,假设数组存放方向为 ← ↑ → ↓, 如果当前方向为 ↑, 就从 ← 开始依次遍历,找到可以走的,如果 ← 可以走,就不用再看 ↑ 了。
在DFS时,加一个参数,用来保存当前的方向(d)。
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <queue>
using namespace std;
int n,m;
char map[][];
int v[][];
struct node
{
int ans,x,y;
};
struct node t,f;
int tx,ty,maxx,maxy;
int fx[]= {,-,,};
int fy[]= {,,,-};
void bfs()
{
queue<node>q;
memset(v,,sizeof(v));
t.x=tx;
t.y=ty;
t.ans=;
q.push(t);
v[t.x][t.y]=;
while(!q.empty())
{
t=q.front();
q.pop();
if(map[t.x][t.y]=='E')
{
printf("%d\n",t.ans);
return ;
}
for(int i=; i<; i++)
{
f.x=t.x+fx[i];
f.y=t.y+fy[i];
if(f.x>=&&f.x<n&&f.y>=&&f.y<m&&v[f.x][f.y]==&&map[f.x][f.y]!='#')
{
f.ans=t.ans+;
v[f.x][f.y]=;
q.push(f);
}
}
}
}
void dfs1(int xx,int yy,int d,int ans)//向左转
{
if(map[xx][yy]=='E')
{
maxx=ans;
return ;
}
if(d==)//0是下1是上2是右3是左
{
if(xx>=&&xx<n&&yy+>=&&yy+<m&&map[xx][yy+]!='#')
{
dfs1(xx,yy+,,ans+);
}
else if(xx+>=&&xx+<n&&yy>=&&yy<m&&map[xx+][yy]!='#')
{
dfs1(xx+,yy,,ans+);
}
else if(xx>=&&xx<n&&yy->=&&yy-<m&&map[xx][yy-]!='#')
{
dfs1(xx,yy-,,ans+);
}
else if(xx->=&&xx-<n&&yy>=&&yy<m&&map[xx-][yy]!='#')
{
dfs1(xx-,yy,,ans+);
}
}
else if(d==)
{
if(xx>=&&xx<n&&yy->=&&yy-<m&&map[xx][yy-]!='#')
{
dfs1(xx,yy-,,ans+);
}
else if(xx->=&&xx-<n&&yy>=&&yy<m&&map[xx-][yy]!='#')
{
dfs1(xx-,yy,,ans+);
}
else if(xx>=&&xx<n&&yy+>=&&yy+<m&&map[xx][yy+]!='#')
{
dfs1(xx,yy+,,ans+);
}
else if(xx+>=&&xx+<n&&yy>=&&yy<m&&map[xx+][yy]!='#')
{
dfs1(xx+,yy,,ans+);
}
}
else if(d==)
{
if(xx->=&&xx-<n&&yy>=&&yy<m&&map[xx-][yy]!='#')
{
dfs1(xx-,yy,,ans+);
}
else if(xx>=&&xx<n&&yy+>=&&yy+<m&&map[xx][yy+]!='#')
{
dfs1(xx,yy+,,ans+);
}
else if(xx+>=&&xx+<n&&yy>=&&yy<m&&map[xx+][yy]!='#')
{
dfs1(xx+,yy,,ans+);
}
else if(xx>=&&xx<n&&yy->=&&yy-<m&&map[xx][yy-]!='#')
{
dfs1(xx,yy-,,ans+);
}
}
else if(d==)
{
if(xx+>=&&xx+<n&&yy>=&&yy<m&&map[xx+][yy]!='#')
{
dfs1(xx+,yy,,ans+);
}
else if(xx>=&&xx<n&&yy->=&&yy-<m&&map[xx][yy-]!='#')
{
dfs1(xx,yy-,,ans+);
}
else if(xx->=&&xx-<n&&yy>=&&yy<m&&map[xx-][yy]!='#')
{
dfs1(xx-,yy,,ans+);
}
else if(xx>=&&xx<n&&yy+>=&&yy+<m&&map[xx][yy+]!='#')
{
dfs1(xx,yy+,,ans+);
}
}
return ;
}
void dfs2(int xx,int yy,int d,int ans)//向右转
{
if(map[xx][yy]=='E')
{
maxy=ans;
return ;
}
if(d==)//0是下1是上2是右3是左
{
if(xx>=&&xx<n&&yy->=&&yy-<m&&map[xx][yy-]!='#')
{
dfs2(xx,yy-,,ans+);
}
else if(xx+>=&&xx+<n&&yy>=&&yy<m&&map[xx+][yy]!='#')
{
dfs2(xx+,yy,,ans+);
}
else if(xx>=&&xx<n&&yy+>=&&yy+<m&&map[xx][yy+]!='#')
{
dfs2(xx,yy+,,ans+);
}
else if(xx->=&&xx-<n&&yy>=&&yy<m&&map[xx-][yy]!='#')
{
dfs2(xx-,yy,,ans+);
}
}
else if(d==)
{
if(xx>=&&xx<n&&yy+>=&&yy+<m&&map[xx][yy+]!='#')
{
dfs2(xx,yy+,,ans+);
}
else if(xx->=&&xx-<n&&yy>=&&yy<m&&map[xx-][yy]!='#')
{
dfs2(xx-,yy,,ans+);
}
else if(xx>=&&xx<n&&yy->=&&yy-<m&&map[xx][yy-]!='#')
{
dfs2(xx,yy-,,ans+);
}
else if(xx+>=&&xx+<n&&yy>=&&yy<m&&map[xx+][yy]!='#')
{
dfs2(xx+,yy,,ans+);
}
}
else if(d==)
{
if(xx+>=&&xx+<n&&yy>=&&yy<m&&map[xx+][yy]!='#')
{
dfs2(xx+,yy,,ans+);
}
else if(xx>=&&xx<n&&yy+>=&&yy+<m&&map[xx][yy+]!='#')
{
dfs2(xx,yy+,,ans+);
}
else if(xx->=&&xx-<n&&yy>=&&yy<m&&map[xx-][yy]!='#')
{
dfs2(xx-,yy,,ans+);
}
else if(xx>=&&xx<n&&yy->=&&yy-<m&&map[xx][yy-]!='#')
{
dfs2(xx,yy-,,ans+);
}
}
else if(d==)
{
if(xx->=&&xx-<n&&yy>=&&yy<m&&map[xx-][yy]!='#')
{
dfs2(xx-,yy,,ans+);
}
else if(xx>=&&xx<n&&yy->=&&yy-<m&&map[xx][yy-]!='#')
{
dfs2(xx,yy-,,ans+);
}
else if(xx+>=&&xx+<n&&yy>=&&yy<m&&map[xx+][yy]!='#')
{
dfs2(xx+,yy,,ans+);
}
else if(xx>=&&xx<n&&yy+>=&&yy+<m&&map[xx][yy+]!='#')
{
dfs2(xx,yy+,,ans+);
}
}
return ;
}
int main()
{
int T,j;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&m,&n);
for(int i=; i<n; i++)
{
scanf("%*c%s",map[i]);
}
for(int i=; i<n; i++)
{
for(j=; j<m; j++)
{
if(map[i][j]=='S')
{
tx=i;
ty=j;
if(i==)//开始方向向下
{
dfs1(tx+,ty,,);
dfs2(tx+,ty,,);
}
else if(i==n-)//开始方向向上
{
dfs1(tx-,ty,,);
dfs2(tx-,ty,,);
}
else if(j==)//开始方向向右
{
dfs1(tx,ty+,,);
dfs2(tx,ty+,,);
}
else if(j==m-)//开始方向向左
{
dfs1(tx,ty-,,);
dfs2(tx,ty-,,);
}
break;
}
}
if(j!=m) break;
}
printf("%d %d ",maxx,maxy);
bfs();
}
return ;
}
POJ:3083 Children of the Candy Corn(bfs+dfs)的更多相关文章
- POJ 3083 -- Children of the Candy Corn(DFS+BFS)TLE
POJ 3083 -- Children of the Candy Corn(DFS+BFS) 题意: 给定一个迷宫,S是起点,E是终点,#是墙不可走,.可以走 1)先输出左转优先时,从S到E的步数 ...
- POJ 3083 Children of the Candy Corn bfs和dfs
Children of the Candy Corn Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8102 Acc ...
- poj 3083 Children of the Candy Corn(DFS+BFS)
做了1天,总是各种错误,很无语 最后还是参考大神的方法 题目:http://poj.org/problem?id=3083 题意:从s到e找分别按照左侧优先和右侧优先的最短路径,和实际的最短路径 DF ...
- poj 3083 Children of the Candy Corn
点击打开链接 Children of the Candy Corn Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8288 ...
- poj3083 Children of the Candy Corn BFS&&DFS
Children of the Candy Corn Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11215 Acce ...
- POJ 3083 Children of the Candy Corn (DFS + BFS + 模拟)
题目链接:http://poj.org/problem?id=3083 题意: 这里有一个w * h的迷宫,给你入口和出口,让你分别求以下三种情况时,到达出口的步数(总步数包括入口和出口): 第一种: ...
- poj 3083 Children of the Candy Corn 【条件约束dfs搜索 + bfs搜索】【复习搜索题目一定要看这道题目】
题目地址:http://poj.org/problem?id=3083 Sample Input 2 8 8 ######## #......# #.####.# #.####.# #.####.# ...
- POJ 3083 Children of the Candy Corn (DFS + BFS)
POJ-3083 题意: 给一个h*w的地图. '#'表示墙: '.'表示空地: 'S'表示起点: 'E'表示终点: 1)在地图中仅有一个'S'和一个'E',他们为位于地图的边墙,不在墙角: 2)地图 ...
- poj 3083 Children of the Candy Corn (广搜,模拟,简单)
题目 靠墙走用 模拟,我写的是靠左走,因为靠右走相当于 靠左走从终点走到起点. 最短路径 用bfs. #define _CRT_SECURE_NO_WARNINGS #include<stdio ...
随机推荐
- 合格PHP工程师的知识结构
摘自http://www.cnblogs.com/ftx5410/p/7204672.html 一下子就想了这么多,后续想到了再补,请大家多多指教.其实编程使用什么语言不重要,最重要的是思想,编程的思 ...
- Esper学习之十二:EPL语法(八)
今天的内容十分重要,在Esper的应用中是十分常用的功能之一.它是一种事件集合,我们可以对这个集合进行增删查改,所以在复杂的业务场景中我们肯定不会缺少它.它就是Named Window. 由于本篇篇幅 ...
- php sqlserver及xdebug扩展配置
;extension=php_bz2.dllextension=php_curl.dll;extension=php_fileinfo.dll;extension=php_ftp.dll;extens ...
- VS自动添加头部注释
让VS自动生成类的头部注释,只需修改两个文集即可,一下两个路径下个有一个 Class.cs文件 D:\Program Files (x86)\Microsoft Visual Studio 14.0\ ...
- 时间的类型的相互转换(date/String)及时区的比较
String ->Date ->String @Test public void date() throws ParseException{ String sdate = "01 ...
- angularjs笔记《二》
小颖最近不知怎么了,老是犯困,也许是清明节出去玩,到现在还没缓过来吧,玩回来真的怕坐车了,报了个两日游得团,光坐车了,把人坐的难受得,去了也就是爬山,回来感觉都快瘫了,小颖去的时候还把我家仔仔抱着一起 ...
- sencha touch 自定义cardpanel控件 模仿改进NavigationView 灵活添加按钮组,导航栏,自由隐藏返回按钮(废弃 仅参考)
最新版本我将会放在:http://www.cnblogs.com/mlzs/p/3382229.html这里的示例里面,这里不会再做更新 代码: /* *模仿且改进NavigationView *返回 ...
- C# 批量上传
完整例子下载 效果: 前台: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="d ...
- Ubuntu 16.04系统下开机提示“无法应用原保存的显示器配置”
开机启动Ubuntu时,提示以下错误,部分截图如图: 解决方法: 按住Ctrl+Alt+T开启终端,输入rm .config/monitors.xml,回车,然后重启Ubuntu即可解决:如图
- thinkphp----替换写标签的方法
在用thinkphp写cmf的时候,考虑到一些方法的复用,所以考虑使用写标签. 写标签的好处在于:通用,而且比较容易看,但是封装一个标签,个人觉得还是比较麻烦,想了想 thinkcmf 调用文章的方式 ...