POJ原址:POJ2632
每次写CSDN文的时候最幸福快乐了~
这题真是太晕了,现在都还不确定有些 if 是不是必要,反正很晕很晕,不清白。
参考链接:
POJ2632-Crashing Robots - ζёСяêτ - 小優YoU - 博客频道 - CSDN.NET
Crashing Robots POJ2632 - 天堂人间 - 博客频道 - CSDN.NET
这两个链接的程序都没怎么参考,第一个主要是让我开始想到用flag来记录,之前一直直接输出,每次发出指令都会输出,差点疯掉。
第二个的程序感觉写得估计应该是非常清晰,可惜自己压根没看。
上一篇的时候说过,想要试着自己不照着攻略写程序,于是就导致在不会的时候想看别人的找点思路也完全看不懂了,不同的人变量设定的都不一样,而且各种方法各种东西完全都不同,很难照着别人的来,本来差点都打算重新按照第二个链接的思路再写一个新的,可是还好没有,终于感动天感动地感动oj…
还有就是之前特傻逼的直接用了题目输出的"Robot 1 crashes into the wall"和"Robot 1 crashes into robot 2",丫的又不是只有两个robot而已,傻啊。
必须谢谢测试数据,让我能一个一个坐标输出来检验:测试数据
程序:
#include<iostream>
using namespace std;
int main()
{
int k;
cin>>k;
while(k--)
{
int a,b,m,n,i,j,k,flag=0,crash=0;
int num,times,crashed=0;
int map[100][100],robot_a[100],robot_b[100],direc[100];//direc应该是个二维数组,行数表示第几个机器人,列数表示它的第几次指令过后的direc
char direc_temp;
memset(map,0,sizeof(map));
memset(robot_a,0,sizeof(robot_a));
memset(robot_b,0,sizeof(robot_b));
memset(direc,0,sizeof(direc));
cin>>a>>b>>n>>m;
for(i=1;i<=n;i++)
{
cin>>robot_a[i]>>robot_b[i]>>direc_temp;
switch(direc_temp)
{
case 'E': direc[i]=0;break;//第i个robot初始的方向
case 'N': direc[i]=1;break;
case 'W': direc[i]=2;break;
case 'S': direc[i]=3;break;
default: direc[i]=-1;
}
map[robot_a[i]][robot_b[i]]=1;
}
for(j=1;j<=m;j++) //遍历每一次instruction
{
char ordor;
cin>>num>>ordor>>times;
switch(ordor)
{
case 'F': break;
case 'R': direc[num]=(direc[num]+2000-times)%4;break;
case 'L': direc[num]=(direc[num]+times)%4;break;
default:direc[num]=-1;
}
if(ordor=='F')
{
for(k=1;k<=times;k++)
{
if(flag==0)
{
map[robot_a[num]][robot_b[num]]=0;
switch(direc[num])//对第num号robot进行一次操作,朝着direc[num]的方向,只改变坐标
{
case 0: robot_a[num]++;break;
case 1: robot_b[num]++;break;
case 2: robot_a[num]--;break;
case 3: robot_b[num]--;break;
}//注意此时坐标已经完成改变了,但是map上的值还并没有变
//cout<<"a[]b[]"<<robot_a[num]<<' '<<robot_b[num]<<endl;用这些语句查错查了好久
//cout<<map[robot_a[num]][robot_b[num]]<<endl;
if(map[robot_a[num]][robot_b[num]]==1)//如果这一位有值了,遍历n个robot找是第几个
{
for(i=1;i<=n;i++)
{
//cout<<"i="<<i<<endl;
//cout<<"robot[][]"<<robot_a[i]<<' '<<robot_b[i]<<endl;
if(robot_a[i]==robot_a[num]&&robot_b[i]==robot_b[num]&&i!=num) //这个i!=num找了可不是一点久
crashed=i; //robot i is crashed
}
crash=num;
flag=1;
//!!!应该这样,做一个标记,表示已经出来了,可以在这里就输出了,但是下一个循环的时候如果这一次已经出来了的话就不再进行
}
else if(robot_a[num]<1||robot_a[num]>a||robot_b[num]<1||robot_b[num]>b)
{
crash=num;
flag=2;
}
}
map[robot_a[num]][robot_b[num]]=1;
}
}
}
if(flag==1)
cout<<"Robot "<<crash<<" crashes into robot "<<crashed<<endl;
if(flag==2)
cout<<"Robot "<<crash<<" crashes into the wall"<<endl;
if(flag==0)
cout<<"OK"<<endl;
}
return 0;
}