题目描述
hx073269最近玩起了机器人游戏,在这个机器人游戏中,他要控制一个机器人进行走动,但是这个机器人只有四个指令,分别为:
N(向上走一步)
S(向下走一步)
E(向右走一步)
W(向左走一步)
如图一所示,机器人从正上方走入方格矩阵,经过10步从最左边走出方格。
如图二所示,机器人从正上方走入方格矩阵,经过三步后,陷入了一个循环,循环的路径长度为8.
现在hx073269希望你写一个程序来判断机器人离开方格矩阵需要多长时间,或者说机器人是如何循环的。
输入
输入包含多组测试用例。
对于每个样例。
第一行包含三个数字 n,m,t,n代表矩阵的行数,m代表矩阵的列数,t代表机器人从正上方的第t列进入迷宫。(1<=n,m<=10, 1=<t<=m)
接下来输入一个n行m列的方格矩阵。
0 0 0 代表输入结束。
输出
对于输入的每个样例,都有一行输出。
要么机器人遵循一定数量的指令,从任意一边的网格中退出,要么机器人遵循一定数量位置上的指令一次,然后重复某些位置上的指令。
下面的示例输入对应于上面的两个网格,并说明了两种输出形式。
样例输入
3 6 5
NEESWE
WWWESS
SNWWWW
4 5 1
SESWE
EESNW
NWEEN
EWSEN
0 0 0
样例输出
10 step(s) to exit
3 step(s) before a loop of 8 step(s)
代码
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n,m,t;
int step=0,pace=0;//step记录总步数,pace记录循环步数
int j,i;
int flag,start;//flag判断两种步数
while(1)
{
scanf("%d%d%d",&n,&m,&t);
int a[n+2][m+2],b[n+2][m+2],c[n+2][m+2];//四周各预留一格
for(i=0;i<n+2;i++){
for(j=0;j<m+2;j++){
a[i][j]=0;
b[i][j]=0;
c[i][j]=0;
}
}//数组初始化
if(n==0&&m==0&&t==0) exit(0);
char ch,chn;
for(i=1;i<n+1;i++)
{
for(j=1;j<m+1;j++)
{
if(j==1) chn=getchar();
scanf("%c",&ch);
switch(ch)
{
case 'N':
a[i][j]=1;
break;
case 'S':
a[i][j]=2;
break;
case 'E':
a[i][j]=3;
break;
case 'W':
a[i][j]=4;
break;
}
}
}//读入每个位点 ,转化为数字
int x=1,y=t,step=1;
start=a[x][y];//起点确定
for(;;)
{
b[x][y]=1;
switch(start)
{
case 1:
x--;
break;
case 2:
x++;
break;
case 3:
y++;
break;
case 4:
y--;
break;
default:
break;
}
start=a[x][y];
if (start==0)
{
flag=1;
break;
}//判断是否走出
if(b[x][y]==1)
{
flag=0;
break;
}//判断是否循环
step++;
}//开始行走,每步读一个字母
if(flag==1)
printf("%d step(s) to exit\n",step);
if(flag==0)
{
pace=0;
start=a[x][y];
while(1)
{
start=a[x][y];
c[x][y]=1;
switch(start)
{
case 1:
x--;
break;
case 2:
x++;
break;
case 3:
y++;
break;
case 4:
y--;
break;
}
pace++;
if (c[x][y]==1) break;
}//进行一次循环 ,记录步数
printf("%d step(s) before a loop of %d step(s)\n",step-pace,pace);
}
}
return 0;
}
ps:oj上数组不能直接初始化成0,必须要经过循环,否则会判错(本人卡在这里很久)