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)
 
 
这个题错的一塌糊涂
刚开始写的代码 不知道哪里有错 ,结果错误
#include<iostream>
#include<string.h>
using namespace std;
char str[][];
int x[],y[],p,q;
void f(char ch)
{
if(ch=='N')p--;
if(ch=='S')p++;
if(ch=='E')q++;
if(ch=='W')q--;
}
int main()
{
int m,n,l,i,k,t;
while(cin>>m>>n){
if(m==&&n==)break;
cin>>l;
x[]=;
y[]=l-;
memset(str,'\0',sizeof(str));
for(i=;i<m;i++){
for(int j=;j<n;j++)cin>>str[i][j];
}
k=;
while(){
p=x[k];
q=y[k];
f(str[x[k]][y[k]]);
if(p<||p==m||q<||q==n){
cout<<k+<<" step(s) to exit"<<endl;
break;
}
t=;
for(i=;i<k;i++){
if(x[k]==x[i]&&y[k]==y[i]){
t=i;
break;
}
}
if(t!=){
cout<<t<<" step(s) before a loop of "<<k-t<<" step(s)"<<endl;
break;
}
k++;
x[k]=p;
y[k]=q;
}
}
return ;
}

检查半天没有结果,就换一种方法来写,结果 超时

#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
char str[][];
int x[][];
int main()
{
int m,n,l;
while(scanf("%d%d",&m,&n)){
if(m==&&n==)break;
scanf("%d",&l);
memset(str,'\0',sizeof(str));
memset(x,,sizeof(x));
int p=,q=l-,k=;
for(int i=;i<m;i++)scanf("%s",str[i]);
while()
{
k++;
if(str[p][q]=='N'&&!x[p][q]){
x[p][q]=k;
p--;
}
else if(str[p][q]=='S'&&!x[p][q]){
x[p][q]=k;
p++;
}
else if(str[p][q]=='E'&&!x[p][q]){
x[p][q]=k;
q++;
}
else if(str[p][q]=='W'&&!x[p][q]){
x[p][q]=k;
q--;
}
else if(x[p][q]){
printf("%d step(s) before a loop of %d step(s)\n",x[p][q]-,k-x[p][q]);
break;
}
else if(p<||q<||p==n||q==m){
printf("%d step(s) to exit\n",k-);
break;
} }
}
return ;
}

最后最后的正确代码,分四个情况,每次移动后都判断是否越界,不越界就走下一步,越界就分情况输出结果

#include<stdio.h>
#include<string.h>
char map[][];
int t[][];
int main()
{
int n,m,k;
int x,y;
while(scanf("%d%d",&n,&m)!=EOF&&(m+n)){
scanf("%d",&k);
for(int i=;i<n;i++) scanf("%s",&map[i]);
x=;
y=k-;
memset(t,,sizeof(t));
t[x][y]=;
while(){
if(map[x][y]=='E'){
y++;
if(y==m){
printf("%d step(s) to exit\n",t[x][y-]);
break;
}
if(t[x][y]!=){
printf("%d step(s) before a loop of %d step(s)\n",t[x][y]-,t[x][y-]-t[x][y]+);
break;
}
t[x][y]=t[x][y-]+;
}
else if(map[x][y]=='W'){
y--;
if(y<){
printf("%d step(s) to exit\n",t[x][y+]);
break;
}
if(t[x][y]!=){
printf("%d step(s) before a loop of %d step(s)\n",t[x][y]-,t[x][y+]-t[x][y]+);
break;
}
t[x][y]=t[x][y+]+;
}
else if(map[x][y]=='N'){
x--;
if(x<) {
printf("%d step(s) to exit\n",t[x+][y]);
break;
}
if(t[x][y]!=){
printf("%d step(s) before a loop of %d step(s)\n",t[x][y]-,t[x+][y]-t[x][y]+);
break;
}
t[x][y]=t[x+][y]+;
}
else{
x++;
if(x==n){
printf("%d step(s) to exit\n",t[x-][y]);
break;
}
if(t[x][y]!=){
printf("%d step(s) before a loop of %d step(s)\n",t[x][y]-,t[x-][y]-t[x][y]+);
break;
}
t[x][y]=t[x-][y]+;
}
}
}
return ;
}

题不难,注意思路!!!

N - Robot Motion(第二季水)的更多相关文章

  1. F - The Fun Number System(第二季水)

    Description In a k bit 2's complement number, where the bits are indexed from 0 to k-1, the weight o ...

  2. D - Counterfeit Dollar(第二季水)

    Description Sally Jones has a dozen Voyageur silver dollars. However, only eleven of the coins are t ...

  3. S - 骨牌铺方格(第二季水)

    Description          在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数.         例如n=3时,为2× 3方格,骨牌的铺放方案有三种, ...

  4. R - 一只小蜜蜂...(第二季水)

    Description          有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行.请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数.         其中,蜂房的结构如下所示.     ...

  5. I - Long Distance Racing(第二季水)

    Description Bessie is training for her next race by running on a path that includes hills so that sh ...

  6. Y - Design T-Shirt(第二季水)

    Description Soon after he decided to design a T-shirt for our Algorithm Board on Free-City BBS, XKA ...

  7. B - Maya Calendar(第二季水)

    Description During his last sabbatical, professor M. A. Ya made a surprising discovery about the old ...

  8. T - 阿牛的EOF牛肉串(第二季水)

    Description          今年的ACM暑期集训队一共有18人,分为6支队伍.其中有一个叫做EOF的队伍,由04级的阿牛.XC以及05级的COY组成.在共同的集训生活中,大家建立了深厚的 ...

  9. E - Number Sequence(第二季水)

    Description A single positive integer i is given. Write a program to find the digit located in the p ...

随机推荐

  1. C#控制条码打印机 纸张大小,间距,绘制内容(所有条码打印机通用)

    其他条码知识 请访问:http://www.ybtiaoma.com ,本文仅供参考,请勿转载,谢谢 using System; using System.Drawing; using System. ...

  2. .C .h 和 .CCP的区别

    1.*.H:C语言规定使用一个变量或调用一个函数前必须声明,为了使用方便,经常把常用函数,例如Windows API的函数,MFC类写入头文件.h,这样每次需要引用时只要使用#include加入就可以 ...

  3. 二维计算几何基础题目泛做(SYX第一轮)

    题目1: POJ 2318 TOYS 题目大意: 给一个有n个挡板的盒子,从左到右空格编号为0...n.有好多玩具,问每个玩具在哪个空格里面. 算法讨论: 直接叉积判断就可以.注意在盒子的边界上面也算 ...

  4. 【solr专题之四】关于VelocityResponseWriter

    一.关于Velocity的基本配置 在Solr中,可以以多种方式返回搜索结果,如单纯的文本回复(XML.JSON.CSV等),也可以返回velocity,js等格式.而VelocityResponse ...

  5. browsersync 浏览器自动刷新神器

    官网:http://www.browsersync.cn/ 基于node,具体安装方法和使用方法参见官网,可以结合gulp等构建工具来用,也可以单独使用.不错~

  6. postgresql赋予/撤消 用户权限

    (1)给予权限:grant           grant select on 表名 to 用户名: (2)撤消权限:revoke           revoke select on 表名 from ...

  7. Java 学习 第一篇

    1:Java文档注释:使用javadoc工具可以提取程序中文档注释来生成API文档:javadoc命令的基本用法:javadoc 选项 java源文件/包javadoc -d {} -windowti ...

  8. 正则取页面图片URL和TABLE BackGround

    /// <summary> /// 根据html文本返回url地址集合 /// </summary> /// <param name="sHtmlText&qu ...

  9. Spring Task Scheduler - No qualifying bean of type [org.springframework.scheduling.TaskScheduler] is defined

    1. Overview In this article, we are discussing the Springorg.springframework.beans.factory.NoSuchBea ...

  10. JVM命令行选项及GC日志

    转:http://blog.csdn.net/q291611265/article/details/48028189 一.设置参数 在使用eclipse编译器的时候,可以采用以下的运行方式来设置虚拟机 ...