hdu 1035 Robot Motion(模拟)

机器人路径规划与模拟算法
本文探讨了使用广度优先搜索算法解决机器人在特定环境中的路径规划问题,并通过HDOJ平台上的RobotMotion题目实例进行深入分析。文章详细介绍了算法实现步骤、关键变量定义以及如何通过BFS算法找到最优路径,同时考虑了路径重复与最优退出点的判断。
//hdu 1035 Robot Motion(模拟)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int N=20;
char ma[N][N];
int mp1[N][N];
bool flag[N*N];
int n,m,k;
int ansstep,ansloop;
void init()
{
    memset(flag,false,sizeof(flag));
    ansstep=0;ansloop=0;
    memset(mp1,0,sizeof(mp1));

}
bool samebfs(int di,int dj)
{
    int dt=di*m+dj;
    queue<int> q;
    q.push(dt);
    flag[dt]=true;
    while(!q.empty())
    {
        int tem=q.front();q.pop();
        int ti=tem/m;
        int tj=tem%m;
        if(ma[ti][tj]=='E')
        {
            if((tj+1)>=m)
            {
                ansstep=mp1[ti][tj]+1;
                return true;
            }
            tj=tj+1;
            dt=ti*m+tj;
            if(flag[dt]==false)
            {
                mp1[ti][tj]=mp1[ti][tj-1]+1;
                q.push(dt);
                flag[dt]=true;
            }
            else
            {
                ansstep=mp1[ti][tj];
                ansloop=mp1[ti][tj-1]-mp1[ti][tj];
                break;
            }
        }
        else if(ma[ti][tj]=='W')
        {
            if(tj-1<0)
            {
                ansstep=mp1[ti][tj]+1;
                return true;
            }
            tj=tj-1;
            dt=ti*m+tj;
            if(flag[dt]==false)
            {
                mp1[ti][tj]=mp1[ti][tj+1]+1;
                q.push(dt);
                flag[dt]=true;
            }
            else
            {
                ansstep=mp1[ti][tj];
                ansloop=mp1[ti][tj+1]-mp1[ti][tj];
                break;
            }
        }
        else if(ma[ti][tj]=='N')
        {
            if(ti-1<0)
            {
                ansstep=mp1[ti][tj]+1;
                return true;
            }
            ti=ti-1;
            dt=ti*m+tj;
            if(flag[dt]==false)
            {
                mp1[ti][tj]=mp1[ti+1][tj]+1;
                q.push(dt);
                flag[dt]=true;
            }
            else
            {
                ansstep=mp1[ti][tj];
                ansloop=mp1[ti+1][tj]-mp1[ti][tj];
                break;
            }
        }
        else if(ma[ti][tj]=='S')
        {
            if(ti+1>=n)
            {
                ansstep=mp1[ti][tj]+1;
                return true;
            }
            ti=ti+1;
            dt=ti*m+tj;
            if(flag[dt]==false)
            {
                mp1[ti][tj]=mp1[ti-1][tj]+1;
                q.push(dt);
                flag[dt]=true;
            }
            else
            {
                ansstep=mp1[ti][tj];
                ansloop=mp1[ti-1][tj]-mp1[ti][tj];
                break;
            }
        }
    }
    ansloop+=1;
    return false;
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        init();
        if(n==0&&m==0) break;
        scanf("%d",&k);
        for(int i=0;i<n;i++)
        {
            scanf("%s",ma[i]);
        }
        bool vis=samebfs(0,k-1);
        if(vis)
        {
            printf("%d step(s) to exit\n",ansstep);
        }
        else
        {
            printf("%d step(s) before a loop of %d step(s)\n",ansstep,ansloop);
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

u014068781

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值