本题传送门

本题知识点:深度优先搜索 + 宽度优先搜索

本题题意是求三个路径长度,第一个是一直往左手边走的距离,第二个是一直往右手边走的距离,第三个是最短距离。

第三个很好办,就是一个简单的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的更多相关文章

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

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

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

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

  3. poj 3083 Children of the Candy Corn

    点击打开链接 Children of the Candy Corn Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8288 ...

  4. 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 ...

  5. POJ 3083 Children of the Candy Corn bfs和dfs

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

  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. K - Children of the Candy Corn(待续)

    K - Children of the Candy Corn Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d ...

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

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

  9. POJ 3083:Children of the Candy Corn

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

随机推荐

  1. Python进阶----异常处理

    Python进阶----异常处理 一丶错误和异常   错误:       语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) #语法错误示范一 if #语法错误示范二 ...

  2. ORACLE表、索引和分区详解

    ORACLE表.索引和分区 一.数据库表 每种类型的表都有不同的特性,分别应用与不同的领域 堆组织表 聚簇表(共三种) 索引组织表 嵌套表 临时表 外部表和对象表 1.行迁移 建表过程中可以指定以下两 ...

  3. 不依赖Python第三方库实现梯度下降

    认识 梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模), 我感觉, 其实就是偏导数向量方向 ...

  4. Linux环境宿主机进入Docker容器、连接数据库、复制文件

    我们默认mysql容器已经正常启动,以下为关键命令.1.docker exec -it mysql bash : 进入已经正常启动的容器bash中,mysql是指实际容器名称.2.mysql -uro ...

  5. JMeter性能测试,入门

    原文转自:https://blog.csdn.net/lovesoo/article/details/78579547 Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件 ...

  6. 【总结】RSS Hub使用经验

    目录 一.RSS Hub的使用 二.RSS使用 Editor: Veagau Time: 2019.10.28 一.RSS Hub的使用 力求简单,能用图形界面操作的就用图形界面操作. Fork RS ...

  7. 离线安装docker(RedHat7.4)

    离线安装docker(RedHat7.4) docker 1. 下载地址 2. 解压并注册为service 1. 下载地址 官网下载地址:下载 官网文档地址:文档 2. 解压并注册为service 下 ...

  8. 解决 Vue 刷新页面后 store 数据丢失的问题

    原来的状态(页面刷新数据会重置) state: { teamA: '主队' }, mutations: { data_teamA(state, x) { state.teamA = x } },   ...

  9. 项目(一)--python3--爬虫实战

    最近看了python3网络爬虫开发实战一书,内容全面,但不够深入:是入门的好书. 作者的gitbook电子版(缺少最后几章) python3网络爬虫实战完整版PDF(如百度网盘链接被屏蔽请联系我更新) ...

  10. 07. vue-router嵌套路由

    嵌套路由用法 1.嵌套路由功能分析 点击父级路由链接显示模板内容 模板内容中又有子级路由链接 点击子级路由链接显示子级模板内容 2.父路由组件模板 父级路由链接 父组件路由填充位 <p> ...