【POJ3083】Children of the Candy Corn
本题知识点:深度优先搜索 + 宽度优先搜索
本题题意是求三个路径长度,第一个是一直往左手边走的距离,第二个是一直往右手边走的距离,第三个是最短距离。
第三个很好办,就是一个简单的bfs的模板,问题出在第一二个。
但第一二个只是方向的丝丝不同,所以会其中一个也就解决了。
读懂题意后很简单,问题是怎么简单高效地实现。
推荐这篇博客
一些感慨:该题做了我差不多4个小时吧,前前后后de了bug又发现有新bug,包括调试的代码,旧代码起码达到了300多行。已经有东西南北方向的想法了,可就是差那么一点点。还是刷题不够吧。总之这4个小时里感到兴奋的心情比难过迷茫的心情要多很多。还是要以学习算法为前提去A题才是快乐A题呀!
// 3083
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
char maze[50][50];
bool take[50][50];
int len[50][50];
int T, W, H, now;
int bh, bw, eh, ew;
int left_len, right_len, min_len;
bool ok;
struct node{
int h, w;
};
queue<node> que;
int rw[] = { -1, 0, 1, 0 };
int rh[] = { 0, 1, 0, -1 };
bool check(int h, int w){
if(0 <= h && h < H && 0 <= w && w < W && maze[h][w] != '#' && !take[h][w]) return true;
return false;
}
void build(int W, int H){
memset(take, false, sizeof(take));
left_len = right_len = min_len = 0;
for(int i = 0; i < H; i++){
scanf("%s", maze[i]);
for(int j = 0; j < W; j++){
if(maze[i][j] == 'S'){
bh = i; bw = j;
// maze[i][j] = '#';
}
if(maze[i][j] == 'E'){
eh = i; ew = j;
}
}
}
if(bh == 0) now = 2;
else if(bh == H - 1) now = 0;
else if(bw == 0) now = 3;
else if(bw == W - 1) now = 1;
}
void l_dfs(int h, int w, int go){
left_len++;
// take[h][w] = true;
if(h == eh && w == ew){
ok = true;
return ;
}
switch(go)
{
case 0:
{
if(check(h, w - 1)) l_dfs(h, w - 1, 1);
else if(check(h - 1, w)) l_dfs(h - 1, w, 0);
else if(check(h, w + 1)) l_dfs(h, w + 1, 3);
else if(check(h + 1, w)) l_dfs(h + 1, w, 2);
break;
}
case 1:
{
if(check(h + 1, w)) l_dfs(h + 1, w, 2);
else if(check(h, w - 1)) l_dfs(h, w - 1, 1);
else if(check(h - 1, w)) l_dfs(h - 1, w, 0);
else if(check(h, w + 1)) l_dfs(h, w + 1, 3);
break;
}
case 2:
{
if(check(h, w + 1)) l_dfs(h, w + 1, 3);
else if(check(h + 1, w)) l_dfs(h + 1, w, 2);
else if(check(h, w - 1)) l_dfs(h, w - 1, 1);
else if(check(h - 1, w)) l_dfs(h - 1, w, 0);
break;
}
case 3:
{
if(check(h - 1, w)) l_dfs(h - 1, w, 0);
else if(check(h, w + 1)) l_dfs(h, w + 1, 3);
else if(check(h + 1, w)) l_dfs(h + 1, w, 2);
else if(check(h, w - 1)) l_dfs(h, w - 1, 1);
break;
}
}
}
void r_dfs(int h, int w, int go){
right_len++;
if(h == eh && w == ew){
ok = true;
return ;
}
switch(go)
{
case 0:
{
if(check(h, w + 1)) r_dfs(h, w + 1, 3);
else if(check(h - 1, w)) r_dfs(h - 1, w, 0);
else if(check(h, w - 1)) r_dfs(h, w - 1, 1);
else if(check(h + 1, w)) r_dfs(h + 1, w, 2);
break;
}
case 1:
{
if(check(h - 1, w)) r_dfs(h - 1, w, 0);
else if(check(h, w - 1)) r_dfs(h, w - 1, 1);
else if(check(h + 1, w)) r_dfs(h + 1, w, 2);
else if(check(h, w + 1)) r_dfs(h, w + 1, 3);
break;
}
case 2:
{
if(check(h, w - 1)) r_dfs(h, w - 1, 1);
else if(check(h + 1, w)) r_dfs(h + 1, w, 2);
else if(check(h, w + 1)) r_dfs(h, w + 1, 3);
else if(check(h - 1, w)) r_dfs(h - 1, w, 0);
break;
}
case 3:
{
if(check(h + 1, w)) r_dfs(h + 1, w, 2);
else if(check(h, w + 1)) r_dfs(h, w + 1, 3);
else if(check(h - 1, w)) r_dfs(h - 1, w, 0);
else if(check(h, w - 1)) r_dfs(h, w - 1, 1);
break;
}
}
}
void bfs(){
len[bh][bw] = 1;
while(!que.empty()){
node now = que.front(), next; que.pop();
int d = len[now.h][now.w];
// printf("d:%d\n", d);
if(now.h == eh && now.w == ew) break;
for(int i = 0; i < 4; i++){
next.h = now.h + rh[i]; next.w = now.w + rw[i];
if(check(next.h, next.w)) {
take[next.h][next.w] = true;
len[next.h][next.w] = d + 1;
que.push(next);
}
}
}
}
int main()
{
scanf("%d", &T);
while(T--){
scanf("%d %d", &W, &H);
build(W, H);
// right
ok = false;
memset(take, false, sizeof(take));
l_dfs(bh, bw, now);
// cout << endl;
ok = false;
memset(take, false, sizeof(take));
r_dfs(bh, bw, now);
while(!que.empty()) que.pop();
memset(take, false, sizeof(take));
memset(len, 0, sizeof(len));
node a; a.h = bh; a.w = bw;
que.push(a);
bfs();
printf("%d %d %d\n", left_len, right_len, len[eh][ew]);
}
return 0;
}
//6
//8 8
//########
//#......#
//#.####.#
//#.####.#
//#.####.#
//#.####.#
//#...#..#
//#S#E####
//9 5
//#########
//#.#.#.#.#
//S.......E
//#.#.#.#.#
//#########
//8 8
//########
//#......#
//#.####.#
//#.####.#
//#.####.#
//#.####.#
//#..#...#
//####E#S#
//9 5
//#########
//#.#.#.#.#
//E.......S
//#.#.#.#.#
//#########
//9 9
//####E####
//#.......#
//#..#.#..#
//#..###..#
//#.......#
//#..#.#..#
//#..#.#..#
//#..#.#..#
//####S####
//9 9
//####S####
//#.......#
//#..#.#..#
//#.#####.#
//#.......#
//#..#.#..#
//#..#.#..#
//#..#.#..#
//####E####
【POJ3083】Children of the Candy Corn的更多相关文章
- 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
点击打开链接 Children of the Candy Corn Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8288 ...
- Children of the Candy Corn 分类: POJ 2015-07-14 08:19 7人阅读 评论(0) 收藏
Children of the Candy Corn Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10933 Acce ...
- 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)
Children of the Candy Corn Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9311 Accepted: ...
- K - Children of the Candy Corn(待续)
K - Children of the Candy Corn Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d ...
- 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
Children of the Candy Corn Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11015 Acce ...
随机推荐
- Python进阶----异常处理
Python进阶----异常处理 一丶错误和异常 错误: 语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) #语法错误示范一 if #语法错误示范二 ...
- ORACLE表、索引和分区详解
ORACLE表.索引和分区 一.数据库表 每种类型的表都有不同的特性,分别应用与不同的领域 堆组织表 聚簇表(共三种) 索引组织表 嵌套表 临时表 外部表和对象表 1.行迁移 建表过程中可以指定以下两 ...
- 不依赖Python第三方库实现梯度下降
认识 梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模), 我感觉, 其实就是偏导数向量方向 ...
- Linux环境宿主机进入Docker容器、连接数据库、复制文件
我们默认mysql容器已经正常启动,以下为关键命令.1.docker exec -it mysql bash : 进入已经正常启动的容器bash中,mysql是指实际容器名称.2.mysql -uro ...
- JMeter性能测试,入门
原文转自:https://blog.csdn.net/lovesoo/article/details/78579547 Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件 ...
- 【总结】RSS Hub使用经验
目录 一.RSS Hub的使用 二.RSS使用 Editor: Veagau Time: 2019.10.28 一.RSS Hub的使用 力求简单,能用图形界面操作的就用图形界面操作. Fork RS ...
- 离线安装docker(RedHat7.4)
离线安装docker(RedHat7.4) docker 1. 下载地址 2. 解压并注册为service 1. 下载地址 官网下载地址:下载 官网文档地址:文档 2. 解压并注册为service 下 ...
- 解决 Vue 刷新页面后 store 数据丢失的问题
原来的状态(页面刷新数据会重置) state: { teamA: '主队' }, mutations: { data_teamA(state, x) { state.teamA = x } }, ...
- 项目(一)--python3--爬虫实战
最近看了python3网络爬虫开发实战一书,内容全面,但不够深入:是入门的好书. 作者的gitbook电子版(缺少最后几章) python3网络爬虫实战完整版PDF(如百度网盘链接被屏蔽请联系我更新) ...
- 07. vue-router嵌套路由
嵌套路由用法 1.嵌套路由功能分析 点击父级路由链接显示模板内容 模板内容中又有子级路由链接 点击子级路由链接显示子级模板内容 2.父路由组件模板 父级路由链接 父组件路由填充位 <p> ...