1.Link:

http://poj.org/problem?id=1573

http://bailian.openjudge.cn/practice/1573/

2.Content:

Robot Motion
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 10856   Accepted: 5260

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 0

Sample Output

10 step(s) to exit
3 step(s) before a loop of 8 step(s)

Source

3.Method:

模拟题,使用arr_mark保存行走路径,走到重复的路则为loop,出边界则为exit

特别注意 0 step(s) before a loop of 4 step(s) 的情况

如:

2 2 1
SW
EN

4.Code:

 #include <iostream>
#include <cstring> using namespace std; //N,E,S,W
const int idx_x[] = {,,,-};
const int idx_y[] = {-,,,};
const char idx_ch[] = {'N','E','S','W'};
const int num_d = ; int main()
{
//freopen("D://input.txt","r",stdin); int y,x;
int i; int w,h,s;
cin >> h >> w >> s; while(h != || w != || s != )
{
int **arr_d = new int*[h];
for(y = ; y < h; ++y) arr_d[y] = new int[w]; char ch;
for(y = ; y < h; ++y)
{
for(x = ; x < w; ++x)
{
cin >> ch;
for(i = ; i < num_d; ++i) if(idx_ch[i] == ch) break;
arr_d[y][x] = i;
}
} //for(y = 0; y < h; ++y)
//{
// for(x = 0; x < w; ++x)
// {
// cout << arr_d[y][x] << " ";
// }
// cout << endl;
//} int **arr_mark = new int*[h];
for(y = ; y < h; ++y)
{
arr_mark[y] = new int[w];
memset(arr_mark[y],,sizeof(int) * w);
} y = ;
x = s - ;
int path = ;
int nx,ny;
while(!arr_mark[y][x])//loop
{
nx = x;
ny = y;
arr_mark[y][x] = ++path; x = nx + idx_x[arr_d[ny][nx]];
y = ny + idx_y[arr_d[ny][nx]]; if(y < || y >= h || x < || x >= w) break;//exit
} if(y < || y >= h || x < || x >=w)
{
cout << path << " step(s) to exit" << endl;
}
else
{
cout << (arr_mark[y][x] - ) << " step(s) before a loop of " << (arr_mark[ny][nx] - arr_mark[y][x] + ) << " step(s)" << endl;
} //for(y = 0; y < h; ++y)
//{
// for(x = 0; x < w; ++x) cout << arr_mark[y][x] << " ";
// cout << endl;
//} for(y = ; y < h; ++y) delete [] arr_mark[y];
delete [] arr_mark; for(y = ; y < h; ++y) delete [] arr_d[y];
delete [] arr_d; cin >> h >> w >> s;
} //fclose(stdin); return ;
}

5.Reference:

http://poj.org/showmessage?message_id=123463

Poj OpenJudge 百练 1573 Robot Motion的更多相关文章

  1. Poj OpenJudge 百练 2632 Crashing Robots

    1.Link: http://poj.org/problem?id=2632 http://bailian.openjudge.cn/practice/2632/ 2.Content: Crashin ...

  2. Poj OpenJudge 百练 1062 昂贵的聘礼

    1.Link: http://poj.org/problem?id=1062 http://bailian.openjudge.cn/practice/1062/ 2.Content: 昂贵的聘礼 T ...

  3. Poj OpenJudge 百练 1860 Currency Exchang

    1.Link: http://poj.org/problem?id=1860 http://bailian.openjudge.cn/practice/1860 2.Content: Currency ...

  4. Poj OpenJudge 百练 2602 Superlong sums

    1.Link: http://poj.org/problem?id=2602 http://bailian.openjudge.cn/practice/2602/ 2.Content: Superlo ...

  5. Poj OpenJudge 百练 2389 Bull Math

    1.Link: http://poj.org/problem?id=2389 http://bailian.openjudge.cn/practice/2389/ 2.Content: Bull Ma ...

  6. Poj OpenJudge 百练 Bailian 1008 Maya Calendar

    1.Link: http://poj.org/problem?id=1008 http://bailian.openjudge.cn/practice/1008/ 2.content: Maya Ca ...

  7. 模拟 POJ 1573 Robot Motion

    题目地址:http://poj.org/problem?id=1573 /* 题意:给定地图和起始位置,robot(上下左右)一步一步去走,问走出地图的步数 如果是死循环,输出走进死循环之前的步数和死 ...

  8. POJ 1573 Robot Motion(BFS)

    Robot Motion Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12856   Accepted: 6240 Des ...

  9. POJ 1573 Robot Motion(模拟)

    题目代号:POJ 1573 题目链接:http://poj.org/problem?id=1573 Language: Default Robot Motion Time Limit: 1000MS ...

随机推荐

  1. Java中Scanner的使用方法

      Scanner是SDK1.5新增的一个类,但是使用该类创建一个对象.Scanner reader=new Scanner(System.in); 然后reader对象调用下列方法(函数),读取用户 ...

  2. 手机NFC通信的安全车钥匙

    SmartKeys for Cyber-Cars:Secure Smartphone-based NFC-enabled Car Immobicizer 手机NFC通信的安全车钥匙 1概述 如今,智能 ...

  3. 关于AutoComplete整合

    AutoComplete应该不是很陌生了,网上也有好多开源的js.今天主要的不是研究Autocomplete这个js的实现.今天主要讲的是将这个js做成一插件.那么今天主要用到的 js插件jquery ...

  4. Mysql分表教程

    一般来说,当我们的数据库的数据超过了100w记录的时候就应该考虑分表或者分区了,这次我来详细说说分表的一些方法.目前我所知道的方法都是MYISAM的,INNODB如何做分表并且保留事务和外键,我还不是 ...

  5. java_类承继其他类的内部类例子

    package ming; class Outer { class In { public In(String msg) { System.out.println(msg); } } } public ...

  6. 最新cocoapods安装流程,安装过程中遇到的问题及解决方法

    最近重新安装了一次cocoapods,参考的安装流程:http://blog.csdn.net/showhilllee/article/details/38398119/ 但是现在的cocoapods ...

  7. 美国L1签证和B1,E2签证的区别

    L1是跨国公司派驻工作人员到美国关联公司工作所需的签证.L1有两种: L1A是给管理人员的.L1B是给关键技术人员的.通过延期,L1A最长时间可达7年. L1B最长时间可达五年. 最初的L1申请,如果 ...

  8. 杂乱无章之Oracle(一)

    1. 设置共享池大小 SQL>ALTER  SYSTEM  SET  SHARED_POOL_SIZE=32M; 2. 数据库高速缓冲区(database  buffer  cache):SQL ...

  9. Syntax highlighter for CKEditor

    http://www.cnblogs.com/moozi/archive/2010/01/06/1640034.html

  10. 使用copy再次实现Circle类,保证不能有内存泄漏问题

    #import <Foundation/Foundation.h> //xieyi @protocol showOn @required -(void)printOn; @end // l ...