POJ 1573 && HDU 1035 Robot Motion(水~)

本文详细介绍了如何使用地图中的SNWE四个方向符号来判断机器人能否走出地图或形成环路,通过输入地图布局和起始位置,输出机器人走出地图的步骤数或形成环路前的步骤数及环路长度。利用标记法跟踪每个点的访问情况,有效识别环路并计算路径长度。

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

Description
给定一个由SNWE几个字母组成的地图,这四个字母代表着四个方向,给定起点,让你判断机器人是否能走出这个地图,或走到某步的时候形成一个环
Input
多组输入,每组用例第一行为三个整数row,col,start分别表示地图的行列数以及机器人从第一行的第几列出发,然后是一个row*col的地图,以row=col=start=0结束输入
Output
对于每组用例,如果机器人能够走出地图则输出其步数,若走到某步形成一个环则输出遇到环之前走的步数以及环的步数
Sample Input
3 6 5
NEESWE
WWWESS
SNWWWW
4 5 1
SESWE
EESNW
NWEEN
EWSEN
0 0 0
Sample Output
10 step(s) to exit
3 step(s) before a loop of 8 step(s)
Solution
先将所有点都标记为0,每走一步就将该点标记为步数,若走到某点发现其标记值不是0则遇到环,那么此时的步数减去该点原先的标记值再加一即为环的步数,该点原先标记值减一即为遇到环之前所走的步数
Code

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define maxn 102
char map[maxn][maxn];
int mark[maxn][maxn];
int row,col,start,step;
int main()
{
    while(cin>>row>>col>>start&&row&&col&&start)
    {
        for(int i=0;i<row;i++)
            for(int j=0;j<col;j++)
                cin>>map[i][j];
        memset(mark,0,sizeof(mark));//初始化 
        step=0;//初始步数为0 
        int x=0,y=start-1,xx,yy;//从(0,start-1)开始 
        while(1)
        {
            mark[x][y]=++step;//标记 
            if(map[x][y]=='N'){xx=x-1;yy=y;}
            if(map[x][y]=='S'){xx=x+1;yy=y;}
            if(map[x][y]=='E'){xx=x;yy=y+1;}
            if(map[x][y]=='W'){xx=x;yy=y-1;}
            if(xx<0||yy<0||xx>=row||yy>=col)//走出地图 
            {
                cout<<step<<" step(s) to exit"<<endl;
                break;
            }
            if(mark[xx][yy]!=0)//遇到环路 
            {
                cout<<mark[xx][yy]-1<<" step(s) before a loop of "<<step-mark[xx][yy]+1<<" step(s)"<<endl;  
                break;  
            }
            x=xx;y=yy;//更新当前坐标 
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值