2014-03-09 11:37:46
題意就不解釋了,很容易明白,直接上代碼
///2014.3.8
///poj2632
/**
*模拟水題,主要是細心
*寫了好長時間,自己程式設計速度還是不夠
*速度不夠有幾個原因
*首先是整體思維的把握不夠強烈,
* 有寫到後面改前面的情況
*其次是編碼不夠熟練,積累不夠
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct robot{
int x,y; ///位置
int direction; ///方向,0表示向東,1表示向北,
/// 2表示向西,3表示向南。
};
struct instr{ ///指令,instructions
int num; ///機器人編号
char act; ///行為
int step; ///執行行為的次數
};
int main( )
{
// freopen("in","r",stdin);
// freopen("out","w",stdout);
int K; ///case數目
scanf("%d",&K);
while( K-- ){
int A,B; ///機器人活動區域大小,A表示長,B表示寬
scanf("%d%d",&A,&B);
int N,M; ///N是機器人數目,M是指令數目
scanf("%d%d",&N,&M);
int area[A+1][B+1]; ///機器人的活動區域
///每一個點的資料是該點的無機器人号
///0表示該點沒有機器人
memset(&area[0][0],0,sizeof(int)*(A+1)*(B+1) ); ///初始化,全設為0(沒有機器人)
robot rob[N+1];
for(int i=1 ; i<=N ; i++){ ///讀入機器人位置和方向
cin>>rob[i].x>>rob[i].y;
area[rob[i].x][rob[i].y] = i;
char direction;
cin>>direction;
switch( direction ){
case 'E':
rob[i].direction = 0; break;
case 'N':
rob[i].direction = 1; break;
case 'W':
rob[i].direction = 2; break;
case 'S':
rob[i].direction = 3; break;
}
}
bool OK = true;
int robotNum,carshNum;
for(int m=0 ; m<M ; m++){
instr ins;
cin>>ins.num>>ins.act>>ins.step;
if( OK ){
switch( ins.act ){
case 'L':
rob[ins.num].direction = (rob[ins.num].direction+1*ins.step)%4;
break;
case 'R':
rob[ins.num].direction = (rob[ins.num].direction+3*ins.step)%4;
break;
case 'F':
for(int j=0 ; j<ins.step ; j++){
if( !OK ) break;
int next_x,next_y;
switch( rob[ins.num].direction ){
case 0:
{
next_x = rob[ins.num].x + 1;
next_y = rob[ins.num].y;
if( next_x>A ){
robotNum = ins.num;
carshNum = -1; ///撞到-1号機器人表示撞牆
OK = false;
}
else if( area[next_x][next_y] ){
robotNum = ins.num;
carshNum = area[next_x][next_y];
OK = false;
}
else{
area[next_x][next_y] = ins.num;
area[rob[ins.num].x][rob[ins.num].y] = 0;
rob[ins.num].x = next_x;
rob[ins.num].y = next_y;
}
} break;
case 1:
{
next_x = rob[ins.num].x;
next_y = rob[ins.num].y+1;
if( next_y>B ){
robotNum = ins.num;
carshNum = -1; ///撞到-1号機器人表示撞牆
OK = false;
}
else if( area[next_x][next_y] ){
robotNum = ins.num;
carshNum = area[next_x][next_y];
OK = false;
}
else{
area[next_x][next_y] = ins.num;
area[rob[ins.num].x][rob[ins.num].y] = 0;
rob[ins.num].x = next_x;
rob[ins.num].y = next_y;
}
} break;
case 2:
{
next_x = rob[ins.num].x-1;
next_y = rob[ins.num].y;
if( next_x<1 ){
robotNum = ins.num;
carshNum = -1; ///撞到-1号機器人表示撞牆
OK = false;
}
else if( area[next_x][next_y] ){
robotNum = ins.num;
carshNum = area[next_x][next_y];
OK = false;
}
else{
area[next_x][next_y] = ins.num;
area[rob[ins.num].x][rob[ins.num].y] = 0;
rob[ins.num].x = next_x;
rob[ins.num].y = next_y;
}
} break;
case 3:
{
next_x = rob[ins.num].x;
next_y = rob[ins.num].y-1;
if( next_y<1 ){
robotNum = ins.num;
carshNum = -1; ///撞到-1号機器人表示撞牆
OK = false;
}
else if( area[next_x][next_y] ){
robotNum = ins.num;
carshNum = area[next_x][next_y];
OK = false;
}
else{
area[next_x][next_y] = ins.num;
area[rob[ins.num].x][rob[ins.num].y] = 0;
rob[ins.num].x = next_x;
rob[ins.num].y = next_y;
}
} break;
}
}
}
}
}
if( OK )
cout<<"OK"<<endl;
else{
if( carshNum==-1 )
printf("Robot %d crashes into the wall\n",robotNum);
else
printf("Robot %d crashes into robot %d\n",robotNum,carshNum);
}
}
return 0;
}