poj 3083 Children of the Candy Corn DFS+BFS

本文深入探讨了在迷宫环境中寻找从起点到终点最短路径的算法实现。通过具体的代码示例,详细讲解了左转优先、右转优先及广度优先搜索(BFS)三种寻路策略的实现细节与效率对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

按照靠左走,靠右走以及最短路径的规则求从S点出发到E点的距离

方向有点难,因为当你改变方向的时候,下一步的方向也就随之改变了;

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#define N 100
using namespace std;
int n,m,ex,ey,sx,sy;
char str[N][N];
int map[N][N];
int d[4][2]= {{-1,0},{0,1},{1,0},{0,-1}};
int leftdfs(int x,int y,int ans,int p)
{
    int i;
    if(x==ex&&y==ey) {
        cout<<ans<<' ';
        return true;
    }
    for(i=0; i<4; i++) {
        int np=(i+p+3)%4;/*按左走是左上右下的顺序*/
        int nx=x+d[np][0],ny=y+d[np][1];
        if(nx<0||nx>=n||ny<0||ny>=m||str[nx][ny]=='#')
            continue;
        if(leftdfs(nx,ny,ans+1,np))
            return true;
    }
    return false;
}
int rightdfs(int x,int y,int ans,int p)
{
    int i;
    if(x==ex&&y==ey) {
        cout<<ans<<' ';
        return true;
    }
    for(i=3; i>=0; i--) {
        int np=(i+2+p)%4;/*按右走是右上左下*/
        int nx=x+d[np][0],ny=y+d[np][1];
        if(nx<0||nx>=n||ny<0||ny>=m||str[nx][ny]=='#')
            continue;
        if(rightdfs(nx,ny,ans+1,np))
            return true;
    }
    return false;
}
void bfs(int x,int y)
{
    int i,j;
    for(i=0; i<N; i++)
        for(j=0; j<N; j++)
            map[i][j]=0;
    typedef pair<int,int> P;
    queue <P>q;
    q.push(P(x,y));
    map[sx][sy]=1;
    while(q.size()) {
        P f=q.front();
        q.pop();
        if(f.first==ex&&f.second==ey) {
            cout<<map[ex][ey]<<endl;
            return;
        }
        for(i=0; i<4; i++) {
            int nx=f.first+d[i][0],ny=f.second+d[i][1];
            if(nx<0||nx>=n||ny<0||ny>=m||str[nx][ny]=='#'||map[nx][ny])/*第一遍的时候忘了检查map[nx][ny]是否遍历过TLE*/
                continue;
            q.push(P(nx,ny));
            map[nx][ny]=map[f.first][f.second]+1;
        }
    }
}
int main()
{
    int t,i;
    cin>>t;
    while(t--) {
        ex=ey=sx=sy=-1;
        scanf("%d%d%*c",&m,&n);
        int p=0;
        for(i=0; i<n; i++) {
            scanf("%s",str[i]);
            for(int j=0; j<m; j++) {
                if(sx!=-1&&ex!=-1)
                    break;
                if(str[i][j]=='S') 
                    sx=i,sy=j;
                else if(str[i][j]=='E')
                    ex=i,ey=j;
            }
        }
        leftdfs(sx,sy,1,0);
        rightdfs(sx,sy,1,0);
        bfs(sx,sy);
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/yu0111/p/5392510.html

在IT领域,尤其是地理信息系统(GIS)中,坐标转换是一项关键技术。本文将深入探讨百度坐标系、火星坐标系和WGS84坐标系之间的相互转换,并介绍如何使用相关工具进行批量转换。 首先,我们需要了解这三种坐标系的基本概念。WGS84坐标系,即“World Geodetic System 1984”,是一种全球通用的地球坐标系统,广泛应用于GPS定位和地图服务。它以地球椭球模型为基础,以地球质心为原点,是国际航空和航海的主要参考坐标系。百度坐标系(BD-09)是百度地图使用的坐标系。为了保护隐私和安全,百度对WGS84坐标进行了偏移处理,导致其与WGS84坐标存在差异。火星坐标系(GCJ-02)是中国国家测绘局采用的坐标系,同样对WGS84坐标进行了加密处理,以防止未经授权的精确位置获取。 坐标转换的目的是确保不同坐标系下的地理位置数据能够准确对应。在GIS应用中,通常通过特定的算法实现转换,如双线性内插法或四参数转换法。一些“坐标转换小工具”可以批量转换百度坐标、火星坐标与WGS84坐标。这些工具可能包含样本文件(如org_xy_格式参考.csv),用于提供原始坐标数据,其中包含需要转换的经纬度信息。此外,工具通常会附带使用指南(如重要说明用前必读.txt和readme.txt),说明输入数据格式、转换步骤及可能的精度问题等。x86和x64目录则可能包含适用于32位和64位操作系统的软件或库文件。 在使用这些工具时,用户需要注意以下几点:确保输入的坐标数据准确无误,包括经纬度顺序和浮点数精度;按照工具要求正确组织数据,遵循读写规则;注意转换精度,不同的转换方法可能会产生微小误差;在批量转换时,检查每个坐标是否成功转换,避免个别错误数据影响整体结果。 坐标转换是GIS领域的基础操作,对于地图服务、导航系统和地理数据分析等至关重要。理解不同坐标系的特点和转换方法,有助于我们更好地处
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值