链接: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;
}