POJ3083 Children of the Candy Corn(Bfs + Dfs)
题意:给一个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)的更多相关文章
- 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 ...
- POJ3083 Children of the Candy Corn(搜索)
题目链接. 题意: 先沿着左边的墙从 S 一直走,求到达 E 的步数. 再沿着右边的墙从 S 一直走,求到达 E 的步数. 最后求最短路. 分析: 最短路好办,关键是沿着墙走不太好想. 但只要弄懂如何 ...
- POJ 3083 -- Children of the Candy Corn(DFS+BFS)TLE
POJ 3083 -- Children of the Candy Corn(DFS+BFS) 题意: 给定一个迷宫,S是起点,E是终点,#是墙不可走,.可以走 1)先输出左转优先时,从S到E的步数 ...
- POJ3083——Children of the Candy Corn(DFS+BFS)
Children of the Candy Corn DescriptionThe cornfield maze is a popular Halloween treat. Visitors are ...
- 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)
Children of the Candy Corn Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9311 Accepted: ...
- poj 3083 Children of the Candy Corn(DFS+BFS)
做了1天,总是各种错误,很无语 最后还是参考大神的方法 题目:http://poj.org/problem?id=3083 题意:从s到e找分别按照左侧优先和右侧优先的最短路径,和实际的最短路径 DF ...
- poj3083 Children of the Candy Corn 深搜+广搜
这道题有深搜和广搜.深搜还有要求,靠左或靠右.下面以靠左为例,可以把简单分为上北,下南,左西,右东四个方向.向东就是横坐标i不变,纵坐标j加1(i与j其实就是下标).其他方向也可以这样确定.通过上一步 ...
- poj 3083 Children of the Candy Corn (广搜,模拟,简单)
题目 靠墙走用 模拟,我写的是靠左走,因为靠右走相当于 靠左走从终点走到起点. 最短路径 用bfs. #define _CRT_SECURE_NO_WARNINGS #include<stdio ...
随机推荐
- 符合语言习惯的Python优雅编程技巧
Python最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净.整洁.一目了然.要写出 Pythonic(优雅的.地道的.整洁的)代码,需要多看多学大牛们写的代码,github 上有很多非常优秀 ...
- JAVA基础-XML的解析
一.XML的概述 XML的全名为可扩展标记语言(Extensible Markup Language),XML的作用为:1.传输,2.存取数据,3.软件的配置文件.传输现在都用更轻量的Json,而存储 ...
- Java基础总结--数组
---数组的定义---组织存储一组数据1.存放相同类型数据的集合--就是一种容器本质上变量也是一种容器--区别就是只存储了一个数据的容器--面对容器,而不是分散的数据eg.买一盘鸡蛋--蛋托其实就是容 ...
- MongoDB备份恢复与导出导入
说明:本文所有操作均在win7下的MongoDB3.4.4版本中进行. 一.备份与恢复 1. 备份: mongodump -h IP --port 端口 -u 用户名 -p 密码 -d数据库 -o 文 ...
- iOS之 Auto Layout
1. 动画 // 修改从 StoryBoard 绑定到类的约束的值 self.boxView.constant += 80 // 在动画闭包里对其父级进行 layoutIfNeeded() UIVie ...
- Vue源码终笔-VNode更新与diff算法初探
写完这个就差不多了,准备干新项目了. 确实挺不擅长写东西,感觉都是罗列代码写点注释的感觉,这篇就简单阐述一下数据变动时DOM是如何更新的,主要讲解下其中的diff算法. 先来个正常的html模板: & ...
- app.get is not a function解决方案
在express4.x中app.js被申明为一个模块,而不是一个主程序入口,在文件的最后暴露出了这个模块,如下所示 app.js module.exports = app; 但是我们在routes目录 ...
- 用python爬取微博数据并生成词云
很早之前写过一篇怎么利用微博数据制作词云图片出来,之前的写得不完整,而且只能使用自己的数据,现在重新整理了一下,任何的微博数据都可以制作出来,放在今天应该比较应景. 一年一度的虐汪节,是继续蹲在角落默 ...
- 软硬链接、文件删除原理、linux中的三种时间、chkconfig优化
第1章 软硬链接 1.1 硬链接 1.1.1 含义 多个文件拥有相同的inode号码 硬链接即文件的多个入口 1.1.2 作用 防止你误删除文件 1.1.3 如何创建硬链接 ln 命令,前面是源文件 ...
- js里面的map、filter、forEach、reduce、for in、for of等遍历方法
1.map 遍历数组,改变原数组 [2, 3, 4, 5].map(function(val, key,arr) { return val > 3; }) var data = [ { name ...