HU-1035 Robot Motion

13885 ワード

http://acm.hdu.edu.cn/showproblem.php?pid=1035
        Robot Motion
Time Limit:2000/1000 MS(Java/Others)    メモリLimit:65536/32768 K(Java/Others)Total Submission(s):5591    Acceepted Submission(s):2604
Problem Description
HDU-1035 Robot Motion
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 a grid.The possible instructions ares 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 the gride beree aving.the.id
Compre 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 determins hoow long it Taes a robot to get out of the grid or how the robot loops around.
 
 
Input
The e e 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 inters separated by blanks:the number of rows in the grid,the number of colds.and the number of the column n in which the robot enters from the north.The possible entrycolumnsarare numbed starting with th the left.The n come the rows of the directctinstrectctions.Each.Each grgridels s s s s s s strererererererererererereres.Ecommmmmmininininininininininininininininininininininininsts.Epas.Ecolushshshshshshshshshshshshshs.Each sts.Epas s.Each ers N,S,E,or W withのblanks.The end of input is indicated by a row containing 0.
 
 
Output
For each gride in the input the is one line of output.Either the robost follows a certain number of instructions and exits the grid on on on the four sides or else the roboot follows the the instruct the Cartionsand the n the instructions on some number of locations repeatdely.The sample input below coreress ponds to the two grids above and illustration the tword.The word"step"is alys mdiatelthe"
 
 
Sample Input
3 6 5 NEESWE WWESS SNWW 4 5 1 SESWEE EESNW NWEEN EWSEN 0
 
 
Sample Output
10 step(s)to exit 3 step(s)before a loop of 8 step(s)
 
#include<stdio.h>
#include<string.h>
int n,m,s,num,num1;
char str[50][50];
int mark[50][50];
void dfs(int x,int y)
{
       int x1,y1;
      if(str[x][y]=='W')
      {
         
          x1=x;
          y1=y-1;
          if(x1<1||x1>n||y1<1||y1>m||mark[x1][y1]==2)
              return ;
          if(mark[x1][y1]==1)
          {
               num1++;
              mark[x1][y1]=2;
              dfs(x1,y1);
             // mark[x1][y1]=0;
          }
          else
          {
              num++;
           mark[x1][y1]=1;
           dfs(x1,y1);
          // mark[x1][y1]=0;
          }
      }
      if(str[x][y]=='S')
      {
          
           x1=x+1;
           y1=y;
           if(x1<1||x1>n||y1<1||y1>m||mark[x1][y1]==2)
               return ;
           if(mark[x1][y1]==1)
          {
              num1++;  
              mark[x1][y1]=2;
              dfs(x1,y1);
        //       mark[x1][y1]=0;
          }
          else
          { 
              num++; 
             mark[x1][y1]=1;
              dfs(x1,y1);
            //  mark[x1][y1]=0;
          }
      }
      if(str[x][y]=='E')
      {
         
          x1=x;
          y1=y+1;
          if(x1<1||x1>n||y1<1||y1>m||mark[x1][y1]==2)
               return ;
          
          if(mark[x1][y1]==1)
          {
              num1++;
              mark[x1][y1]=2;
              dfs(x1,y1);
            //   mark[x1][y1]=0;
          }
          else
          { num++;
            mark[x1][y1]=1;
            dfs(x1,y1);
        //    mark[x1][y1]=0;
          }
      }
      if(str[x][y]=='N')
      {
          x1=x-1;
          y1=y;
          if(x1<1||x1>n||y1<1||y1>m||mark[x1][y1]==2)
              return ;
          if(mark[x1][y1]==1)
          {
              num1++;
              mark[x1][y1]=2;
              dfs(x1,y1);
            //   mark[x1][y1]=0;
          }
          else
          {
             num++;
            mark[x1][y1]=1;
            dfs(x1,y1);
        //    mark[x1][y1]=0;
          }
      }
}
int main()
{
    int i,j;
    while(~scanf("%d%d%d",&n,&m,&s))
    {
           num=0,num1=0;
        if(n==0&&m==0&&s==0)
            break;
        memset(mark,0,sizeof(mark));
        getchar();
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
             scanf("%c",&str[i][j]);
            getchar();
        }
             dfs(1,s);
             if(num1==0)
             printf("%d step(s) to exit
",num+1); else if(1==num+1-num1) printf("0 step(s) before a loop of %d step(s)
",num1); else printf("%d step(s) before a loop of %d step(s)
",num+1-num1,num1); } return 0; }