这个题写出来没用太多时间。。但是不知道怎么回事。。总是出现错误。。希望有时间的朋友们帮忙看看。。
题目大意以及思路我写的很清楚。。http://acm.pku.edu.cn/JudgeOnline/problem?id=1573原题。。
C语言:
Codee#12514
//北京大学ACM poj1573
//2010年8月3日
//题目大意:一个机器人在一个格子中行走。。可能有两种情况:机器人行走N个指令出去。。情况2:先行走N个指令。。然后在行走M个指令,,也就是转圈
//并且不会停下来了。。问题:输出的是哪一种情况
//我的思路:定义一个二维数组。。根据数组的行与列最终变化的值,来判断是哪一种的情况
//完成状况:已完成。
#include <stdio.h>
#define MAX 120
char Graph_Grid[MAX][MAX];
int Road_Grid[MAX*MAX][2];//用于记录机器人所走的路劲
void Case_Grid(int Row,int Rank,int n)
{
int i,j;
int k;
int sign=0;//定义一个标记值,初始化为0;
int lx=0,steps=0;
i=1,j=n;//开始的时候初始化,让i等于第一行,让j等于所给数据中机器人的所处位置
while(1)//用的是死循环。。意思是直到出去的时候才结束这个循环
{
if(Graph_Grid[i][j]=='N')
{
i--;
Road_Grid[lx][0]=j;//就是记录路径的坐标情况
Road_Grid[lx][1]=i;
lx++;
}
else if(Graph_Grid[i][j]=='S')
{
i++;
Road_Grid[lx][0]=j;
Road_Grid[lx][1]=i;
lx++;
}
else if(Graph_Grid[i][j]=='W')
{
j--;
Road_Grid[lx][0]=j;
Road_Grid[lx][1]=i;
lx++;
}
else if(Graph_Grid[i][j]=='E')
{
j++;
Road_Grid[lx][0]=j;
Road_Grid[lx][1]=i;
lx++;
}
if(i<1||i>Row||j<1||j>Rank)//第一种情况,如果是超出边界打印。。并且结束这个死循环。。
{
printf("%d step(s) to exit",lx);
break;
}
//对于第二种情况,关键的思路是记录是否坐标发生过重复,如果发生过重复,我们可以相当然的认为它是构成了一个圈。。也就是死下去了
for(k=0;k<lx-1;k++)//为什么是lx-1而不是lx;
{
if(Road_Grid[k][0]==j&&Road_Grid[k][1]==i)
{
steps=k;
sign=1;
break;
}
}
if(sign==1)
{
printf("%d step(s) before a loop of %d step(s)",steps+1,lx-steps-1);//模拟一下。。可以理解数据
break;
}
}
}
int main()
{
int Row,Rank,n;
int i,j;
while(scanf("%d%d%d",&Row,&Rank,&n)!=EOF&&Row!=0,Rank!=0,n!=0)
{
getchar();
memset(Graph_Grid,100,MAX*MAX);
for(i=1;i<=Row;i++)
{
for(j=1;j<=Rank;j++)
{
scanf("%c",&Graph_Grid[i][j]);
}
getchar();//细节问题
}
Case_Grid(Row,Rank,n);
printf("/n");
}
return 0;
}
//2010年8月3日
//题目大意:一个机器人在一个格子中行走。。可能有两种情况:机器人行走N个指令出去。。情况2:先行走N个指令。。然后在行走M个指令,,也就是转圈
//并且不会停下来了。。问题:输出的是哪一种情况
//我的思路:定义一个二维数组。。根据数组的行与列最终变化的值,来判断是哪一种的情况
//完成状况:已完成。
#include <stdio.h>
#define MAX 120
char Graph_Grid[MAX][MAX];
int Road_Grid[MAX*MAX][2];//用于记录机器人所走的路劲
void Case_Grid(int Row,int Rank,int n)
{
int i,j;
int k;
int sign=0;//定义一个标记值,初始化为0;
int lx=0,steps=0;
i=1,j=n;//开始的时候初始化,让i等于第一行,让j等于所给数据中机器人的所处位置
while(1)//用的是死循环。。意思是直到出去的时候才结束这个循环
{
if(Graph_Grid[i][j]=='N')
{
i--;
Road_Grid[lx][0]=j;//就是记录路径的坐标情况
Road_Grid[lx][1]=i;
lx++;
}
else if(Graph_Grid[i][j]=='S')
{
i++;
Road_Grid[lx][0]=j;
Road_Grid[lx][1]=i;
lx++;
}
else if(Graph_Grid[i][j]=='W')
{
j--;
Road_Grid[lx][0]=j;
Road_Grid[lx][1]=i;
lx++;
}
else if(Graph_Grid[i][j]=='E')
{
j++;
Road_Grid[lx][0]=j;
Road_Grid[lx][1]=i;
lx++;
}
if(i<1||i>Row||j<1||j>Rank)//第一种情况,如果是超出边界打印。。并且结束这个死循环。。
{
printf("%d step(s) to exit",lx);
break;
}
//对于第二种情况,关键的思路是记录是否坐标发生过重复,如果发生过重复,我们可以相当然的认为它是构成了一个圈。。也就是死下去了
for(k=0;k<lx-1;k++)//为什么是lx-1而不是lx;
{
if(Road_Grid[k][0]==j&&Road_Grid[k][1]==i)
{
steps=k;
sign=1;
break;
}
}
if(sign==1)
{
printf("%d step(s) before a loop of %d step(s)",steps+1,lx-steps-1);//模拟一下。。可以理解数据
break;
}
}
}
int main()
{
int Row,Rank,n;
int i,j;
while(scanf("%d%d%d",&Row,&Rank,&n)!=EOF&&Row!=0,Rank!=0,n!=0)
{
getchar();
memset(Graph_Grid,100,MAX*MAX);
for(i=1;i<=Row;i++)
{
for(j=1;j<=Rank;j++)
{
scanf("%c",&Graph_Grid[i][j]);
}
getchar();//细节问题
}
Case_Grid(Row,Rank,n);
printf("/n");
}
return 0;
}