杭电OJ 1035
题目的意思不难理解,我建了一个坐标系使得字符二维数组a[x][y]中x,y分别对应坐标系中的x坐标和y坐标。
以第一个样例为例,建立的坐标系如下,红色网格为运动范围,超出红色网格范围,即x>=行数或x<0或y>=列数或y<0时,机器人退出。
#include <stdio.h>
#include <string.h>
char a[1000][1000];//指令数组
int b[1000][1000]={0};//标志数组,标志该位置是否到过
int main()
{
int n,m,start,flag,count,c,d;
int i,j,x,y,cnt;
while(scanf("%d%d%d",&n,&m,&start)!=EOF){
if(n==0&&m==0) break;
getchar();
memset(b,0,sizeof(b)); //标记数组记为0
for(i=0;i<n;i++)
gets(a[i]);
x=0;y=start-1;cnt=0;flag=0;
while(x<n&&x>=0&&y<m&&y>=0){//一定要细心,条件判断不能错
if(!b[x][y]){
if(a[x][y]=='W'){
b[x][y]=1;
y=y-1;
cnt++;
}
else if(a[x][y]=='E'){
b[x][y]=1;
y=y+1;
cnt++;
}
else if(a[x][y]=='S'){
b[x][y]=1;
x=x+1;
cnt++;
}
else{
b[x][y]=1;
x=x-1;
cnt++;
}
}
else{//某位置到过了,将出现循环
flag=1;
break;
}
}
if(flag==0) printf("%d step(s) to exit\n",cnt);
else{
count=0;//count统计循环长度
c=x;d=y;
while(1){
if(a[x][y]=='W') {
b[x][y]=1;
y=y-1;
count++;
}
else if(a[x][y]=='E'){
b[x][y]=1;
y=y+1;
count++;
}
else if(a[x][y]=='S'){
b[x][y]=1;
x=x+1;
count++;
}
else{
b[x][y]=1;
x=x-1;
count++;
}
if(x==c&&y==d){
printf("%d step(s) before a loop of %d step(s)\n",cnt-count,count);
break;
}
}
}
memset(a,0,sizeof(a));
}
return 0;
}