HDU 1035 Robot Motion

Problem Description

 
A robot has been programmed to follow the instructions in its path. Instructions for the next direction the robot is to move are laid down in a grid. The possible instructions are

N north (up the page) 
S south (down the page) 
E east (to the right on the page) 
W west (to the left on the page)

For example, suppose the robot starts on the north (top) side of Grid 1 and starts south (down). The path the robot follows is shown. The robot goes through 10 instructions in the grid before leaving the grid.

Compare what happens in Grid 2: the robot goes through 3 instructions only once, and then starts a loop through 8 instructions, and never exits.

You are to write a program that determines how long it takes a robot to get out of the grid or how the robot loops around.

Input

There will be one or more grids for robots to navigate. The data for each is in the following form. On the first line are three integers separated by blanks: the number of rows in the grid, the number of columns in the grid, and the number of the column in which the robot enters from the north. The possible entry columns are numbered starting with one at the left. Then come the rows of the direction instructions. Each grid will have at least one and at most 10 rows and columns of instructions. The lines of instructions contain only the characters N, S, E, or W with no blanks. The end of input is indicated by a row containing 0 0 0.

Output

For each grid in the input there is one line of output. Either the robot follows a certain number of instructions and exits the grid on any one the four sides or else the robot follows the instructions on a certain number of locations once, and then the instructions on some number of locations repeatedly. The sample input below corresponds to the two grids above and illustrates the two forms of output. The word “step” is always immediately followed by “(s)” whether or not the number before it is 1.

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)

题目大意:

输入x,y,表示一个x*y的字符矩阵,输入c表示从第一行的第c个字符开始执行,N表示向上,S表示向下,E表示向右,W表示向左。如果最终走出矩阵则输出 s step(s) to exit,s表示走出矩阵所用步数,如果进入循环则输出s-w step(s) before a loop of w step(s),s-w为进入循环前走的步数,w表示循环内部的步数。

C++

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char m[15][15];
int n[15][15];
int x,y,s,w;
int jq(int a)
{
    int b,c,d,e,f;
    b=1;n[b][a]=1;
    while(1)
    {
        if(m[b][a]=='N')
        {
            b--;s++;
            if(n[b][a]!=0)
            {
                w=n[b+1][a]-n[b][a]+1;
                return w;
            }
            n[b][a]=n[b+1][a]+1;
        }
        else if(m[b][a]=='S')
        {
            b++;s++;
            if(n[b][a]!=0)
            {
                w=n[b-1][a]-n[b][a]+1;
                return w;
            }
            n[b][a]=n[b-1][a]+1;
        }
        else if(m[b][a]=='W')
        {
            a--;s++;
            if(n[b][a]!=0)
            {
                w=n[b][a+1]-n[b][a]+1;
                return w;
            }
            n[b][a]=n[b][a+1]+1;
        }
        else if(m[b][a]=='E')
        {
            a++;s++;
            if(n[b][a]!=0)
            {
                w=n[b][a-1]-n[b][a]+1;
                return w;
            }
            n[b][a]=n[b][a-1]+1;
        }
        if(b>x||b<=0||a>y||a<=0)
            return w;
    }
}
int main()
{
    int a,b,c,d,e,f;
    while(cin>>x>>y)
    {
        if(x==0&&y==0)
            break;
        cin>>c;
        memset(n,0,sizeof(n));
        s=0;w=0;
        for(a=1;a<=x;a++)
        {
            for(b=1;b<=y;b++)
                cin>>m[a][b];
        }
        f=jq(c);
        if(f==0)
            printf("%d step(s) to exit\n",s);
        else
            printf("%d step(s) before a loop of %d step(s)\n",s-w,w);
    }
    return 0;
}





全部评论

相关推荐

bg双非本科,方向是嵌入式。这次秋招一共拿到了&nbsp;8&nbsp;个&nbsp;offer,最高年包&nbsp;40w,中间也有一段在海康的实习经历,还有几次国家级竞赛。写这篇不是想证明什么,只是想把自己走过的这条路,尽量讲清楚一点,给同样背景的人一个参考。一、我一开始也很迷茫刚决定走嵌入式的时候,其实并没有一个特别清晰的规划。网上的信息很零散,有人说一定要懂底层,有人说项目更重要,也有人建议直接转方向。很多时候都是在怀疑:1.自己这种背景到底有没有机会2.现在学的东西到底有没有用3.是不是已经开始晚了这些问题,我当时一个都没答案。二、现在回头看,我主要做对了这几件事第一,方向尽早确定,但不把自己锁死。我比较早就确定了嵌入式这个大方向,但具体做哪一块,是在项目、竞赛和实习中慢慢调整的,而不是一开始就给自己下结论。第二,用项目和竞赛去“证明能力”,而不是堆技术名词。我不会刻意追求学得多全面,而是确保自己参与的每个项目,都能讲清楚:我负责了什么、遇到了什么问题、最后是怎么解决的。第三,尽早接触真实的工程环境。在海康实习的那段时间,对我触动挺大的。我开始意识到,企业更看重的是代码结构、逻辑清晰度,以及你能不能把事情说清楚,而不只是会不会某个知识点。第四,把秋招当成一个需要长期迭代的过程。简历不是一次写完的,面试表现也不是一次就到位的。我会在每次面试后复盘哪些问题没答好,再针对性补。三、我踩过的一些坑现在看也挺典型的:1.一开始在底层细节上纠结太久,投入产出比不高2.做过项目,但前期不会总结,导致面试表达吃亏3.早期有点害怕面试,准备不充分就去投这些弯路走过之后,才慢慢找到节奏。四、给和我背景相似的人一点建议如果你也是双非,准备走嵌入式,我觉得有几件事挺重要的:1.不用等“准备得差不多了”再投2.项目一定要能讲清楚,而不是做完就算3.不要只盯着技术,多关注表达和逻辑很多时候,差的不是能力,而是呈现方式。五、写在最后这篇总结不是标准答案,只是我个人的一次复盘。后面我会陆续把自己在嵌入式学习、竞赛、实习和秋招中的一些真实经验拆开来讲,希望能对后来的人有点帮助。如果你正好也在这条路上,希望你能少走一点弯路。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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