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. UIProgressView 圆角

    里面外面都变成圆角 不用图片 直接改变layer 重点是里面外面都是圆角哦 for (UIImageView * imageview in self.progress.subviews) { imag ...

  2. IOS 中关于自定义Cell 上的按钮 开关等点击事件的实现方法(代理)

    1.在自定义的Cell .h文件中写出代理,写出代理方法. @protocol selectButtonDelegate <NSObject> -(void)selectModelID:( ...

  3. Linq的基础2

    var 构建匿名类型1 = from c in ctx.GetTable<Customers>()                          select new          ...

  4. 《javascript高级程序设计》笔记4.1.4:检测类型

    javascript类型检测这节主要讲了typeof和instanceof操作符. 一.typeof操作符: 1.typeof在检测基本数据类型时十分方便,针对4种基本数据类型string.numbe ...

  5. php缩放gif和png格式透明背景变成黑色的解决方法

    在对gif或png格式的图片进行缩放等操作时,原本透明背景的图片最后都变成黑色的,解决办法 $img = imagecreatetruecolor(, ); //2.上色 $color=imageco ...

  6. [转]fatal error: iostream.h: No such file or directory

    iostream.h是非标准头文件,iostream是标准头文件形式.iostream.h时代没有名词空间,即所有库函数包括头文件iostream.h都声明在全局域.为了体现结构层次,c++标准委员会 ...

  7. javascrit字符串截取

    昨天遇见一个问题就是一个地址后面加参数第一次是需要添加参数,以后每次点击按钮的时候是替换如果不进行处理的话如果页面不刷新,地址会不断的添加越来越长,所以

  8. 异常处理与调试 - 零基础入门学习Delphi50

    异常处理与调试 让编程改变世界 Change the world by program 异常处理与调试 在应用程序开发中如何检测.处理程序的运行错误是一个很重要的问题. 有些错误是无法控制的. 如何处 ...

  9. C 宏定义

    C/C++中宏使用总结 .C/C++中宏总结C程序的源代码中可包括各种编译指令,这些指令称为预处理命令.虽然它们实际上不是C语言的一部分,但却扩展了C程序设计的环境.本节将介绍如何应用预处理程序和注释 ...

  10. 开源欣赏wordpress之文章新增页面如何实现。

    本地网址http://localhost/wordpress/wp-admin/post-new.php 进而找到post-new.php页面. 进入之后, require_once( dirname ...