Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 9449 | Accepted: 4594 |
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
Output
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)
題目大意:
10 * 10的地圖,機器人移動規則是:按照上北,下南,左西,右東進行移動,直到到達出口。入口則是第一行某一列,列數爲輸入第三個數據。
#include <stdio.h>
#include <memory.h>
int mark[12][12];
char map[12][12];
int main()
{
int i,j,m,n,sta,x,y,row,col,count;
while(scanf("%d%d%d",&m,&n,&sta) && m && n && sta)
{
getchar();//注意此處吸收掉一個回車
count = 0;
memset(map,'O',sizeof(map));//map數組需要多加一圈'O'(大寫字母O),以判斷出界情況.
memset(mark,0,sizeof(mark));//標記數組,用來記錄某一位置走過幾次
for(i=1; i<=m; i++)
{
for(j=1; j<=n; j++)
{
scanf("%c",&map[i][j]);
}
getchar();//注意換行出回車也需要吸收掉
}
x = 1;//起始行爲第一行
y = sta;//起始列爲輸入的sta
while(1)
{
mark[x][y] ++;//標記數組加一,必須再條件判斷之前加,否則起始位置沒有加。(表示被此處坑過,一直wa)
if(map[x][y] == 'N')
x --;
else if(map[x][y] == 'S')
x ++;
else if(map[x][y] == 'W')
y --;
else if(map[x][y] == 'E')
y ++;
else if(map[x][y] == 'O')//遇到出口,輸出,跳出
{
printf("%d step(s) to exit\n",count);
break;
}
count ++;//計數變量加一,經驗證,此處不可更換位置。
if(mark[x][y] == 2)//如果某處走過兩次,說明此處是環的起始位置
{
row = x;//記錄此處座標
col = y;
mark[x][y] = 1;//此處走過此處置爲1
x = 1;//從起點位置重新走
y = sta;
count = 0;//計數變量置0
while(1)
{
if(x == row && y == col && mark[x][y] == 1)//進入環的起點
{
printf("%d step(s) before a loop of ",count);//輸出入環之前走的步數
mark[x][y] ++;//標記此位置加一
count = 0;//count置0
}
if(x == row && y == col && mark[x][y] == 2 && count != 0)//再次到這個位置,即環的終點
{
printf("%d step(s)\n",count);//輸出環的長度
break;
}
//機器人的移動
if(map[x][y] == 'N')
x --;
else if(map[x][y] == 'S')
x ++;
else if(map[x][y] == 'W')
y --;
else if(map[x][y] == 'E')
y ++;
count ++;//每移動一次,計數變量加一
}
break;
}
}
}
return 0;
}