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 ...
随机推荐
- Esper学习之三:进程模型
之前对Esper所能处理的事件结构进行了概述,并结合了例子进行讲解,不清楚的同学请看Esper学习之二:事件类型.今天主要为大家解释一下Esper是怎么处理事件的,即Esper的进程模型. 1.Upd ...
- 【Spring系列】Spring AOP面向切面编程
前言 接上一篇文章,在上午中使用了切面做防重复控制,本文着重介绍切面AOP. 在开发中,有一些功能行为是通用的,比如.日志管理.安全和事务,它们有一个共同点就是分布于应用中的多处,这种功能被称为横切关 ...
- Linux命令 swap:内存交换空间
swap 内存交换空间的概念 swap使用上的限制
- vue比较模板来跟新数据
一,使用场景: 点击menu通过路由,跳转当前列表,第二次点击menu,希望可以刷新列表: 二,解决思路: 给路由添加时间戳: 三,参考观点: 用 :key管理可复用的元素 模板相同,会造成一种“复用 ...
- 题目1102:最小面积子矩阵(暴力求解&最大连续子序列)
题目链接:http://ac.jobdu.com/problem.php?pid=1102 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...
- sencha touch 简单的倒计时插件
效果如图: 代码: Ext.define('ux.label.Countdown', { alternateClassName: 'labelCountdown', extend: 'Ext.Comp ...
- [转]Windows上搭建Kafka运行环境
[转]http://www.cnblogs.com/alvingofast/p/kafka_deployment_on_windows.html Windows上搭建Kafka运行环境 完整解决方 ...
- C# 未能加载文件或程序集“mysql.data”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
报错信息: 在web.config中已经加了以下代码. <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-co ...
- 使用VLC推送TS流(纯图版)
在没有编码器的情况下,可以使用VLC进行推送TS+UDP流 操作步骤如下: 一.UDP方式: 媒体-->流 选用要播放的文件,可以选择多个来播放,选择串流播放 这里直接点击下一步 需要选择在本地 ...
- ajax无刷新获取天气信息
浏览器由于安全方面的问题,禁止ajax跨域请求其他网站的数据,但是可以再本地的服务器上获取其他服务器的信息,在通过ajax请求本地服务来实现: <?php header("conten ...