1035--Robot Motion

本文详细解析了HDU 1035迷宫问题的解题思路与代码实现。介绍了如何通过深度优先搜索解决迷宫问题,并特别关注于循环检测与步数计算的方法。

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

题目链接


http://acm.hdu.edu.cn/showproblem.php?pid=1035

Sample Input
3 6 5
NEESWE
WWWESS
SNWWWW
4 5 1
SESWE
EESNW
NWEEN
EWSEN
0 0

Sample Output
10 step(s) to exit
3 step(s) before a loop of 8 step(s)


解题思路


/*
- 这个题目最开始一看还是蛮简单的,一道简单的 
- 搜题,但是这道题跟以往的迷宫有点差别,就是
- 个题目指定了行走的路径,相对来说也就简单了
- 多,题目有俩种情况:
- 1.能出去,输出步数。(出去就代表越
- (⊙_⊙))
- 2.出不去。也就是陷入了循环。也蛮简单,定义
- 个标记数组,走过标记一下,当下次再次走到,
- 然走不通。输出即可,
- 这里我遇到了一个问题,就是怎么计算环的大小。
- 最开始我的想法是,走到那个循环坐标点,然后再用
- 一个dfs,起点就是最开始点,终点就是此坐
- 点,遍历出步数,然后总步数一减即可,觉得挺
- 单,但是总是输出的是随机数,
- 于是就去看了一下大佬们的log,发现了一个好方法,
- 可以将之前的走过的坐标记录下来,然后循环遍
- 一遍,找到步数即可。

*/

代码


#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 100;
char ma[maxn][maxn];
int vis[maxn][maxn];
int m,n,k;

struct Coordinate
{
    int x,y;
}path[maxn];
void dfs(int x, int y, int cnt)
{
    if(x<0 || x>=m || y<0 || y>=n)
    {
        //found the exit
        cout << cnt << " step(s) to exit" <<endl;
        return;
    }
    if(vis[x][y]) //循环点
    {
        int i;
        for(i=0; i<cnt; ++i)
        {
            if(path[i].x==x && path[i].y==y)
                break;
        }
        cout << i << " step(s) before a loop of " << cnt-i << " step(s)" <<endl;
        return;
    }
    //标记走过
    vis[x][y] = 1;
    //记录坐标
    path[cnt].x = x;
    path[cnt].y = y; 
    if(ma[x][y] == 'N')
    {
        dfs(x-1,y,cnt+1);
    }
    if(ma[x][y] == 'S')
    {
        dfs(x+1,y,cnt+1);
    }
    if(ma[x][y] == 'W')
    {
        dfs(x,y-1,cnt+1);
    }
    if(ma[x][y] == 'E')
    {
        dfs(x,y+1,cnt+1);
    }

}
int main()
{
    while(cin>>m>>n>>k)
    {
        if(!m && !n && !k)
            break;
        memset(vis,0,sizeof(vis));
        for(int i=0; i<m; ++i)
            cin >> ma[i];
        dfs(0,k-1,0); //起点坐标,步数
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值