zoukankan      html  css  js  c++  java
  • ACM Robot Motion

     

    机器人已被编程为按照其指令中的路径进行操作。机器人要移动的下一个方向的指令放在网格中。可能的指令是

    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) 

    例如,假设机器人从网格1的北面(顶部)开始,然后开始向南(下)。机器人的路径如图所示。在离开网格之前,机器人会在网格中执行10条指令。

    比较一下网格2:机器人只经过3次指令,然后通过8条指令开始循环,从不退出。

    您要编写一个程序,用于确定机器人离开网格所需的时间以及机器人环绕的周期。

    Input

    将有一个或多个网格用于漫游器导航。每个数据的格式如下。第一行是三个整数,以空格分隔:网格中的行数,网格中的列数以及机器人从北方进入的列数。可能的条目列从左侧开始编号。然后来排列方向说明。每个网格将具有至少一个,最多十行和多列指令。指令行仅包含没有空格的字符N,S,E或W。输入结束由含0 0 0的行表示。
    Output

    对于输入中的每个网格,都有一行输出。机器人遵循一定数量的指令,并在四方面的任何一个上退出网格,否则机器人会按照一定数量的位置上的指令进行一次,然后重复一些位置上的指令。下面的样本输入对应于上面的两个网格,并说明了两种形式的输出。 “step”一词紧随其后的是“(s)”,前面的数字是否为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)

     1 #include<stdio.h>
     2 #include<bits/stdc++.h>
     3 using namespace std;
     4 char paths[1005][1005];
     5 int step[1005][1005];
     6 int r,c,start,row,col,exitstep,diestep,diex,diey;
     7 bool die = false;
     8 /*感想:实现递归的过程,一定要注意代码的整洁,不是指格式,而是逻辑思路,
     9 就像数学的提取公因式一样,不要把同样的语句写太多遍,重复语句的执行会增加运行时间,
    10 简单说,有可能因为的重复语句,不能实现AC目的*/
    11 void solve(int row,int col,int num)
    12 {
    13     if(row < 0|| col < 0 || row >= r || col >= c) /*跳出网格*/ 
    14     {
    15         exitstep = num;
    16         return;
    17     }
    18     if(step[row][col]) /*陷入循环*/ 
    19     {
    20         die = true;
    21         diex = col;
    22         diey = row;
    23         diestep = step[row][col];
    24         step[row][col] = num - step[row][col];
    25         return;
    26     }
    27     //cout<<paths[row][col]<<endl;
    28     step[row][col] = num;
    29     if(paths[row][col] == 'N')
    30         solve(row-1,col,num+1);                
    31     else if(paths[row][col] == 'S')
    32         solve(row+1,col,num+1);
    33     else if(paths[row][col] == 'E')
    34         solve(row,col+1,num+1);        
    35     else if(paths[row][col] == 'W')
    36         solve(row,col-1,num+1);    
    37 }
    38 
    39 int main()
    40 {
    41     while(cin>>r>>c,r||c)
    42     {
    43         cin>>start;
    44         for(int i = 0; i < r; i++)
    45             scanf("%s",paths[i]);
    46         memset(step,0,sizeof(step));
    47         die = false;
    48         start = start -1;
    49         solve(0,start,1);
    50         if(die)  //3 step(s) before a loop of 8 step(s)
    51             cout<< --diestep<<" step(s) before a loop of "<<step[diey][diex]<<" step(s)"<<endl;
    52         else    //10 step(s) to exit
    53             cout<<--exitstep<<" step(s) to exit"<<endl;
    54     }
    55     return 0;
    56 }
  • 相关阅读:
    什么是程序员的优秀品质?【转】
    我也来评“超级女声”五强选手
    ddd
    在window 2003 server下遇到的asp错误
    几个asp+操作日期的函数
    vb.net常用函数
    WordPress使用小记
    asp.net身份验证方式
    水晶报表如何导出为Excel文档
    ListView选中selectedItem上下移动
  • 原文地址:https://www.cnblogs.com/jj81/p/7447073.html
Copyright © 2011-2022 走看看