POJ 2632 Crashing Robots
/* 题目很好理解,要你判断机器人的路径,输出
* 碰撞信息,关键是题目的二维数组需要转换(下标不一样)
* 还有就是机器人的状态要及时更新,我就在这儿调试了
* 半天才找出来的,郁闷了。
* 机器人状态: 坐标x,y,方向drt,方向要及时更新,
* 地图也要及时更新,就差不多了。
*/
code
#include<iostream>
using namespace std;
struct Node
{
int x,y;
int drt;
}rob[105];
int map[105][105],n,m;
int check(int index,int step)
{
int i=0;
int x = rob[index].x-1;
int y = rob[index].y-1;
map[x][y] = -1;
if(rob[index].drt == 0)
{
for(i=1;i<=step;++i)
{
if(x+i>=n)
return -1;
if(map[x+i][y]==-1)
continue;
else
return map[x+i][y];
}
map[x+step][y]=index;
rob[index].x+=step;
} if(rob[index].drt == 1)
{
for(i=1;i<=step;++i)
{
if(y+i>=m)
return -1;
if(map[x][y+i]!=-1)
return map[x][y+i];
}
map[x][y+step]=index;
rob[index].y += step;
} if(rob[index].drt == 3)
{
for(i=1;i<=step;++i)
{
if(y-i<0)
return -1;
if(map[x][y-i]!=-1)
return map[x][y-i];
}
map[x][y-step]=index;
rob[index].y -=step;
}if(rob[index].drt == 2)
{
for(i=1;i<=step;++i)
{
if(x-i<0)
return -1;
if(map[x-i][y]!=-1)
return map[x-i][y];
}
map[x-step][y]=index;
rob[index].x -=step;
}
return 0;
}
int main()
{
char ch;
int i,j,k,time,nr_rob,nr_ins,tmp,rep,num_rob,flag;
cin>>time;
while(time--)
{
cin>>m>>n;
cin>>nr_rob>>nr_ins;
for(i=0;i<n;++i)
for(j=0;j<m;++j)
map[i][j]=-1;
for(i=1;i<=nr_rob;++i)
{
//scanf("%d%d%c",&(rob[i].y),&(rob[i].x),&ch);
cin>>rob[i].y>>rob[i].x>>ch;
if(ch=='N') tmp = 0;
else if(ch=='E') tmp = 1;
else if(ch=='S') tmp = 2;
else if(ch=='W') tmp =3;
rob[i].drt = tmp;
map[rob[i].x-1][rob[i].y-1] = i;
}
flag = 0;
for(i=0;i<nr_ins;++i)
{
cin>>num_rob>>ch>>rep;
if(ch=='L')
rob[num_rob].drt = (rob[num_rob].drt+3*rep)%4;
else if(ch=='R')
rob[num_rob].drt = (rob[num_rob].drt+1*rep)%4;
else if(ch =='F')
{
if(flag ==1)
continue;
tmp = check(num_rob,rep);
if(tmp == 0)
continue;
else if(tmp == -1)
{
printf("Robot %d crashes into the wall\n",num_rob);
flag = 1;
}
else
{
printf("Robot %d crashes into robot %d\n",num_rob,tmp);
flag = 1;
}
}
}
if(flag == 0)
cout<<"OK"<<endl;
}
return 0;
}
using namespace std;
struct Node
{
int x,y;
int drt;
}rob[105];
int map[105][105],n,m;
int check(int index,int step)
{
int i=0;
int x = rob[index].x-1;
int y = rob[index].y-1;
map[x][y] = -1;
if(rob[index].drt == 0)
{
for(i=1;i<=step;++i)
{
if(x+i>=n)
return -1;
if(map[x+i][y]==-1)
continue;
else
return map[x+i][y];
}
map[x+step][y]=index;
rob[index].x+=step;
} if(rob[index].drt == 1)
{
for(i=1;i<=step;++i)
{
if(y+i>=m)
return -1;
if(map[x][y+i]!=-1)
return map[x][y+i];
}
map[x][y+step]=index;
rob[index].y += step;
} if(rob[index].drt == 3)
{
for(i=1;i<=step;++i)
{
if(y-i<0)
return -1;
if(map[x][y-i]!=-1)
return map[x][y-i];
}
map[x][y-step]=index;
rob[index].y -=step;
}if(rob[index].drt == 2)
{
for(i=1;i<=step;++i)
{
if(x-i<0)
return -1;
if(map[x-i][y]!=-1)
return map[x-i][y];
}
map[x-step][y]=index;
rob[index].x -=step;
}
return 0;
}
int main()
{
char ch;
int i,j,k,time,nr_rob,nr_ins,tmp,rep,num_rob,flag;
cin>>time;
while(time--)
{
cin>>m>>n;
cin>>nr_rob>>nr_ins;
for(i=0;i<n;++i)
for(j=0;j<m;++j)
map[i][j]=-1;
for(i=1;i<=nr_rob;++i)
{
//scanf("%d%d%c",&(rob[i].y),&(rob[i].x),&ch);
cin>>rob[i].y>>rob[i].x>>ch;
if(ch=='N') tmp = 0;
else if(ch=='E') tmp = 1;
else if(ch=='S') tmp = 2;
else if(ch=='W') tmp =3;
rob[i].drt = tmp;
map[rob[i].x-1][rob[i].y-1] = i;
}
flag = 0;
for(i=0;i<nr_ins;++i)
{
cin>>num_rob>>ch>>rep;
if(ch=='L')
rob[num_rob].drt = (rob[num_rob].drt+3*rep)%4;
else if(ch=='R')
rob[num_rob].drt = (rob[num_rob].drt+1*rep)%4;
else if(ch =='F')
{
if(flag ==1)
continue;
tmp = check(num_rob,rep);
if(tmp == 0)
continue;
else if(tmp == -1)
{
printf("Robot %d crashes into the wall\n",num_rob);
flag = 1;
}
else
{
printf("Robot %d crashes into robot %d\n",num_rob,tmp);
flag = 1;
}
}
}
if(flag == 0)
cout<<"OK"<<endl;
}
return 0;
}