第一次WA了,倒不是因为答案错了,而是没等输入结束就输出结果,剩下没输入的数据就不高兴了(>﹏<)。
第二次runtime error,因为当时数组只设了100个(题目提供的test case<=100,所以设为100本来应该恰好足够的),但是for循环的时候从1开始循环100次就会遇到“r[100]”的情况,此时数组越界!w(゚Д゚)w 所以为了保险下一次还是设数组为r[105]吧。
今天第一次用这个输入输出数据( ﹁ ﹁ ) ~→
freopen("D:\input.txt","r",stdin);
freopen("D:\output.txt","w",stdout);
还挺好用的。。。
关于题目中遇到的问题:1.robot移动的过程中,每走一步都可能会crash到别的robot,所以每走一步都要检查一下是否发生了crashing。 2.用结构体储存多个robots的状态(位置和前进方向)。
#include <iostream>
#include <cstdio>
using namespace std;
int rob;
int length,width;
bool flag;
struct robots
{
int xi,yi;
char towards;
}r[105];
bool judge_border(int i) //判断是否出界
{
if(1<=r[i].xi&&r[i].xi<=length&&1<=r[i].yi&&r[i].yi<=width)
return false;
else
return true;
}
int judge_crash(int i) //判断是否发生碰撞
{
int n;
for (n=1;n<=rob;n++)
{
if(i!=n)
{
if(r[i].xi==r[n].xi&&r[i].yi==r[n].yi)
return n;
}
}
return 0;
}
void turn_left(int i,int times) //向左转的情况
{
int n;
for(n=0;n<times;n++)
{
switch(r[i].towards)
{
case 'E':r[i].towards='N';
break;
case 'S':r[i].towards='E';
break;
case 'W':r[i].towards='S';
break;
case 'N':r[i].towards='W';
break;
}
}
}
void turn_right(int i,int times) //向右转的情况
{
int n;
for(n=0;n<times;n++)
{
switch(r[i].towards)
{
case 'E':r[i].towards='S';
break;
case 'S':r[i].towards='W';
break;
case 'W':r[i].towards='N';
break;
case 'N':r[i].towards='E';
break;
}
}
}
void go_straight(int i,int times) //向前走
{
int n;
int iscrash;
for(n=0;n<times;n++)
{
switch(r[i].towards)
{
case 'E':r[i].xi+=1;
break;
case 'W':r[i].xi-=1;
break;
case 'S':r[i].yi-=1;
break;
case 'N':r[i].yi+=1;
break;
}
if(judge_crash(i))
{
iscrash=judge_crash(i);
cout<<"Robot "<<i<<" crashes into robot "<<iscrash<<endl; //<span style="font-family: Arial, Helvetica, sans-serif;">由于三种不同的输出结果是平行的,且不在同一个代码段进行判断,所以使用flag标记</span>
flag=false;
break;
}
}
if(flag)
{
if(judge_border(i))
{
cout<<"Robot "<<i<<" crashes into the wall"<<endl;
flag=false; //由于三种不同的输出结果是平行的,且不在同一个代码段进行判断,所以使用flag标记
}
}
}
void move(int i,char order,int times) //判断命令的属性
{
switch(order)
{
case 'L':turn_left(i,times);
break;
case 'R':turn_right(i,times);
break;
case 'F':go_straight(i,times);
break;
}
}
int main()
{
//freopen("D:\input.txt","r",stdin);
//freopen("D:\output.txt","w",stdout);
int n,i,j,act;
int num[105],times[105];
char order[105];
cin>>n;
while(n--)
{
cin>>length>>width;
cin>>rob>>act;
for(i=1;i<=rob;i++)
{
cin>>r[i].xi>>r[i].yi>>r[i].towards;
}
for(j=0;j<act;j++)
{
cin>>num[j]>>order[j]>>times[j];
} //不要急!输入结束后再输出结果
for(j=0;j<act;j++)
{
flag=true;
move(num[j],order[j],times[j]);
if(!flag)
break;
}
if(flag)
{
cout<<"OK"<<endl;
}
}
return 0;
}