热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

POJ3083:糖果children的DFS和BFS算法探索

题目链接:http://poj.org/problem?id=3083。题目描述:给定一个迷宫,其中'S'表示起点,'E'表示终点,'#'表示墙壁,'.'表示可通行的道路。起点和终点均位于迷宫的边界上,并且保证存在唯一路径。任务是求从起点'S'到终点'E'的最短路径步数,且优先考虑向左转弯。通过深度优先搜索(DFS)和广度优先搜索(BFS)算法进行路径探索,分析两种方法的优劣及适用场景。

题目链接:http://poj.org/problem?id=3083

题目大意:给你一个迷宫,S是起点,E是终点,#是墙,.是路,S、E在迷宫的边界,并且有唯一解;求优先左转S到E的步数,优先右转S到E的步数,以及S到E的最短步数。

题解:

1、本题的难点在于左转优先以及右转优先,下一步的方向取决于当前位置的方向,用DFS不断的按优先方向遍历一遍迷宫即可;我定义如图:

  前(0)  
左(1) 当前位置方向(dir) 右(3)
  后(2)  

以左转优先为例,便利迷宫的方向依次为:左、前、右、后;即:

左:(dir+1)%4

前;(dir+0)%4

右:(dir+3)%4

后:(dir+2)%4

右转优先只要改变一下遍历方向即可;

2、求S到E的最短路用BFS遍历即可;

*具体看代码注释

#include 
#include 
#include 
#include 
using namespace std;

struct point
{
    int x,y,step;
};
char map[50][50];
queueq;
int n,m;
int lstep,rstep;
int go[4][2]={-1,0,0,-1,1,0,0,1};//四个方向,按左、前、右、后存储

int is_way(int x,int y)//判断此点是否可走
{
    if(x<0 || x>=n || y<0 || y>=m || map[x][y]==#)
        return 0;
    return 1;
}

void ldfs(int x,int y,int dir)//左转优先,x,y记录当前位置,dir记录当前方向
{
    lstep++;//步数
    //cout<//getchar();
    if(map[x][y]==E) return;//找到终点退出
    if( is_way(x+go[(dir+1)%4][0],y+go[(dir+1)%4][1]) )//左转
        ldfs( x+go[(dir+1)%4][0], y+go[(dir+1)%4][1], (dir+1)%4 );
    else if( is_way(x+go[(dir)%4][0],y+go[(dir)%4][1]) )//前走
        ldfs( x+go[(dir)%4][0], y+go[(dir)%4][1], (dir)%4 );
    else if( is_way(x+go[(dir+3)%4][0],y+go[(dir+3)%4][1]) )//右转
        ldfs( x+go[(dir+3)%4][0], y+go[(dir+3)%4][1], (dir+3)%4 );
    else ldfs( x+go[(dir+2)%4][0], y+go[(dir+2)%4][1], (dir+2)%4 );//后退
}

void rdfs(int x,int y,int dir)//右转优先
{
    rstep++;
    if(map[x][y]==E) return;
    if( is_way(x+go[(dir+3)%4][0],y+go[(dir+3)%4][1]) )//右转
        rdfs( x+go[(dir+3)%4][0], y+go[(dir+3)%4][1], (dir+3)%4 );
    else if( is_way(x+go[(dir)%4][0],y+go[(dir)%4][1]) )//前走
        rdfs( x+go[(dir)%4][0], y+go[(dir)%4][1], (dir)%4 );
    else if( is_way(x+go[(dir+1)%4][0],y+go[(dir+1)%4][1]) )//左转
        rdfs( x+go[(dir+1)%4][0], y+go[(dir+1)%4][1], (dir+1)%4 );
    else rdfs( x+go[(dir+2)%4][0], y+go[(dir+2)%4][1], (dir+2)%4 );//后退
}

int bfs()//求S到E最短距离,BFS模板即可
{
    while(!q.empty())
    {
        point p=q.front();
        q.pop();
        for(int i=0;i<4;i++)
        {
            int x=p.x+go[i][0];
            int y=p.y+go[i][1];
            if(map[x][y]==E) return p.step+1;
            if(is_way(x,y))
            {
                point temp;
                temp.x=x;
                temp.y=y;
                temp.step=p.step+1;
                q.push(temp);
                map[x][y]=#;
            }
        }
    }
    return 0;
}

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        while(!q.empty())
            q.pop();
        int x,y;
        cin>>m>>n;
        for(int i=0;i)
            for(int j=0;j)
            {
                cin>>map[i][j];
                if(map[i][j]==S)
                {
                    x=i;
                    y=j;
                }
            }
        lstep=0;
        rstep=0;
        ldfs(x,y,0);
        rdfs(x,y,0);
        point p;
        p.x=x;
        p.y=y;
        p.step=1;
        q.push(p);
        map[x][y]=#;
        cout<<<endl;
    }
    return 0;
}

后:(dir+2)%4

POJ 3083 Children of the Candy Corn (DFS+BFS)


推荐阅读
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • 使用GDI的一些AIP函数我们可以轻易的绘制出简 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 落樱3D v0.5是一款在Android平台上发布的3D美少女格斗游戏,本次更新带来了多项新功能和优化。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 本文将带领读者深入了解Android系统源码在手机中的实际表现,通过详细的步骤和专业的解释,帮助你更好地理解Android系统的底层运作机制。 ... [详细]
  • 本文将介绍网易NEC CSS框架的规范及其在实际项目中的应用。通过详细解析其分类和命名规则,探讨如何编写高效、可维护的CSS代码,并分享一些实用的学习心得。 ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 本文详细介绍了Git分布式版本控制系统中远程仓库的概念和操作方法。通过具体案例,帮助读者更好地理解和掌握如何高效管理代码库。 ... [详细]
  • 本文探讨了MariaDB在当前数据库市场中的地位和挑战,分析其可能面临的困境,并提出了对未来发展的几点看法。 ... [详细]
  • 本次考试于2016年10月25日上午7:50至11:15举行,主要涉及数学专题,特别是斐波那契数列的性质及其在编程中的应用。本文将详细解析考试中的题目,并提供解题思路和代码实现。 ... [详细]
  • HDU 1394:线段树优化求解逆序对问题
    本文介绍如何使用线段树高效求解排列中的逆序对问题。通过单点增减和区间求和操作,线段树能够快速处理此类问题,并提供了一种替代树状数组的解决方案。 ... [详细]
  • 本文介绍了一种解决二元可满足性(2-SAT)问题的方法。通过具体实例,详细解释了如何构建模型、应用算法,并提供了编程实现的细节和优化建议。 ... [详细]
  • Qt中QSpinBox与QSlider的联动实现
    本文介绍如何在Qt框架下将QSpinBox和QSlider组件进行联动,使用户在拖动滑块或修改文本框中的数值时,两个组件能同步更新,从而提供更加直观和便捷的用户体验。 ... [详细]
author-avatar
viggieg-may_789
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有