本题传送门

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

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

第三个很好办,就是一个简单的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. Parameter 0 of method sqlSessionTemplate in org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration required a single bean, but 2 were found:

    Parameter 0 of method orderSqlSessionFactory in com.config.MultipleDBConfig required a single bean, ...

  2. mysql-数据库查询语句汇总

    目录 数据库查询语句 ***** 添加数据补充: 所有的select 关键字 where 条件 distinct 去除重复记录 指定字段 取别名 group by having order limit ...

  3. 【夯实基础】- Integer.valueof()和Integer.parseInt()的区别

    今天在看公司代码的时候,看到有人在将 String 转为 int 时,用到了Integer.parseInt(String s)方法,我一直用的是Integer.valueOf(String s)方法 ...

  4. JQ实现购物车全选跟总计全选

    //GoodsCheck购物车每个店铺的checkBox//goods-check购物车所有的checkBox//ShopCheck店铺全选的按钮//commlistFrm店铺商品的模块//allCh ...

  5. 冠捷显示成功的信息化建设(MES应用案例)

    企业介绍 冠捷科技集团是驰誉全球的大型高科技跨国企业,产品包括彩色显示器( CRT monitor ).液晶显示器( LCD monitor ).液晶电视( LCD-TV )与等离子电视( PDP ) ...

  6. springboot多环境下maven打包

    前言: 最近在项目中使用springboot时发现,采用在pom中定义不同的profile,并且maven打包时 采用-P参数并不能替换我application.properties文件中指定占位符的 ...

  7. githe和github连接,上传

    Git入门 如果你完全没有接触过Git,你现在只需要理解通过Git的语法(敲入一些命令)就可以将代码上传到远程的仓库或者下载到本地的仓库(服务器),可知我们此时应该有两个仓库,就是两个放代码的地方,一 ...

  8. Oracle 11g RAC to RAC ADG搭建(一)采用rman备份恢复方式

    (一)基础环境   主库 备库 操作系统 RedHat6.7 RedHat6.7 服务器名称 primarydb1primarydb2 standbydb1standbydb2 IP地址规划 192. ...

  9. 免费的天气API测试接口

    网上几乎所有的天气接口都需要注册key,然后还各种频率限制,每天调用次数才几百次? 太坑爹了吧 一个简单的天气预报功能, 为什么要搞的这么复杂, 收什么费? 推荐一个真正免费的天气API接口, 返回j ...

  10. HashMap不足性分析

    不足性: 1.缺陷就在于其高度依赖hash算法,如果key是自定义类,你得自己重写hashcode方法,写hash算法. 而且hashmap要求,存入时的hashcode什么样,之后就不能在变更,如果 ...