Robot Motion

链接:http://poj.org/problem?id=1573

Problem  Description:

 

机器人已经被编程以遵循其路径中的指示。机器人要移动的下一个方向的说明放在网格中。可能的指令是 
N北(页面上) 
S南(页面下) 
E东(页面右) 
W西(页面左) 
例如,假设机器人在北面开始(顶部)网格1的一侧并开始向南(向下)。显示了机器人遵循的路径。离开电网之前,机器人会通过电网中的10条指令。 
比较Grid 2中发生的事情:机器人只经历3次指令,然后通过8条指令开始循环,并且永远不会退出。 
你要编写一个程序来确定一个机器人离开电网需要多长时间,或者机器人如何循环。

 Input:

将有一个或多个机器人导航网格。每个数据的格式如下。第一行是由空格分隔的三个整数:网格中的行数,网格中的列数以及机器人从北方进入的列数。可能的输入栏从左边的一个开始编号。然后来到方向指示的行。每个网格至少有一行和最多10行和指令列。指令行只包含字符N,S,E或W,没有空格。输入的结尾由包含0 0 0的行表示。

Output:

对于输入中的每个网格,都有一行输出。机器人遵循一定数量的指令并从四边中的任何一边离开网格,或者机器人遵循一定数量的位置上的指令,然后重复若干位置上的指令。下面的示例输入对应于上面的两个网格,并说明了两种形式的输出。无论前面的数字是否为1,“step”一词总是紧跟“(s)”。

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)

思路:这道题其实也不难,主要是你的思路一定要清晰,明确。我就是卡在了一个细节上。我定义了一个结构体,结构体中每一个成员都有两个变量,一个是字符a,还有一个是用来标记步数的flag,方便后来判断机器人是否陷入循环。flag的初值都定义为0,后来走一步就更新一个flag。

My  DaiMa:

 

#include<stdio.h>
#include<iostream>
using namespace std;
typedef struct
{
    char a;
    int flag;
}character;
character s[101][101];
int main()
{
    int n,m,t,k,x;
    char ch[101];
    while(~scanf("%d%d",&n,&m))
    {
        if(n==0||m==0)
            break;
        else
        {
            scanf("%d",&t);
            for(int i=0;i<n;i++)
            {
                scanf("%s",ch);
                for(int j=0;j<m;j++)
                {
                    s[i][j].a=ch[j];
                    s[i][j].flag=0;//初定义
                }
            }
            int i,j;
            i=0,j=t-1,k=x=0;//k是标记机器人的步数,x是标记机器人是否进入了循环
            while((i>=0&&i<n)&&(j>=0&&j<m))
            {
                k++;//只要机器人还没有离开网格,就得走下一步,即k++
                if(s[i][j].flag!=0)//如果它的flag不等于0的话,就说明机器人陷入循环
                {
                    x=-1;
                    break;
                }
                s[i][j].flag=k;//让flag记录的是第几步,这样的话,
                if(s[i][j].a=='W')//当循环时就知道是第几步开始进入了循环
                {
                    j--;
                }
                else if(s[i][j].a=='N')
                {
                    i--;
                }
                else if(s[i][j].a=='E')
                {
                    j++;
                }
                else if(s[i][j].a=='S')
                {
                    i++;
                }
            }
            if(x==-1)
                printf("%d step(s) before a loop of %d step(s)\n",s[i][j].flag-1,k-s[i][j].flag);
            else
                printf("%d step(s) to exit\n",k);
        }
    }
    return 0;
}<stdio.h>
#include<iostream>
using namespace std;
typedef struct
{
    char a;
    int flag;
}character;
character s[101][101];
int main()
{
    int n,m,t,k,x;
    char ch[101];
    while(~scanf("%d%d",&n,&m))
    {
        if(n==0||m==0)
            break;
        else
        {
            scanf("%d",&t);
            for(int i=0;i<n;i++)
            {
                scanf("%s",ch);
                for(int j=0;j<m;j++)
                {
                    s[i][j].a=ch[j];
                    s[i][j].flag=0;//初定义
                }
            }
            int i,j;
            i=0,j=t-1,k=x=0;//k是标记机器人的步数,x是标记机器人是否进入了循环
            while((i>=0&&i<n)&&(j>=0&&j<m))
            {
                k++;//只要机器人还没有离开网格,就得走下一步,即k++
                if(s[i][j].flag!=0)//如果它的flag不等于0的话,就说明机器人陷入循环
                {
                    x=-1;
                    break;
                }
                s[i][j].flag=k;//让flag记录的是第几步,这样的话,
                if(s[i][j].a=='W')//当循环时就知道是第几步开始进入了循环
                {
                    j--;
                }
                else if(s[i][j].a=='N')
                {
                    i--;
                }
                else if(s[i][j].a=='E')
                {
                    j++;
                }
                else if(s[i][j].a=='S')
                {
                    i++;
                }
            }
            if(x==-1)
                printf("%d step(s) before a loop of %d step(s)\n",s[i][j].flag-1,k-s[i][j].flag);
            else
                printf("%d step(s) to exit\n",k);
        }
    }
    return 0;
}

 

全部评论

相关推荐

来个厂收我吧:首先,市场侧求职我不是很懂。 但是,如果hr把这份简历给我,我会觉得求职人不适合做产品经理。 问题点: 1,简历的字体格式不统一,排版不尽如人意 2,重点不突出,建议参考star法则写个人经历 3,印尼官方货币名称为印度尼西亚卢比(IDR),且GMV690000印尼盾换算为305人民币,总成交额不高。 4,右上角的意向职位在发给其他公司时记得删除。 5,你所有的经历都是新媒体运营,但是你要投市场营销岗位,jd和简历不匹配,建议用AI+提示词,参照多个jd改一下经历内容。 修改建议: 1,统一字体(中文:思源黑体或微软雅黑,英文数字:time new romans),在word中通过表格进行排版(b站学) 2,校招个人经历权重:实习经历=创业经历(大创另算)>项目经历>实训经历>校园经历 3,请将项目经历时间顺序改为倒序,最新的放最上方。 4,求职方向不同,简历文字描述侧重点也需要不同。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务