208K 16MS 2379B 2013-02-10 23:04:05 1A 蛇年第一A
1》机器人有3种属性:横坐标x, 纵坐标y, 面向dir。因此用结构体存机器人的信息,规定E为0, N为1,w为2, S为3
2》 如果是向前走:
if(方向==0) x++; if(方向==1) y++; if(方向==2) x--; if(方向==3) y--;
3》转弯:
向走转n次:方向dir=(dir+n)%4;
向右转n次:方向dir=(dir-n%4+4)%4;
4》判断是否和别的机器人发生碰撞,int visit[i][j]=k,表示坐标为(x, y)处有机器人k
5》为了处理方便且不影响后面的输入将M行指挥机器人的信息存在结构体内
#include<stdio.h> #include<string.h> char dirc[4]={'E', 'N', 'W', 'S'}; int visit[105][105]; struct Robot { int x, y, dir; }; struct Minfor { int r, ti; char ai[5]; }; int main() { int T, n, m, a, b, i, j; char d[5]; scanf("%d", &T); while(T--) { scanf("%d%d", &a, &b); scanf("%d%d", &n, &m); Robot R[105]; Minfor MM[105]; memset(visit, 0, sizeof(visit)); for(i=1; i<=n; i++) { scanf("%d%d%s", &R[i].x, &R[i].y, d); if(d[0]=='E') R[i].dir=0; if(d[0]=='N') R[i].dir=1; if(d[0]=='W') R[i].dir=2; if(d[0]=='S') R[i].dir=3; visit[R[i].x][R[i].y]=i; } for(i=1; i<=m; i++) scanf("%d%s%d", &MM[i].r, MM[i].ai, &MM[i].ti); int flag=0; for(i=1; i<=m; i++) { int rr=MM[i].r; if(MM[i].ai[0]=='F') //向前走 { int xx=R[rr].x, yy=R[rr].y, dd=R[rr].dir; visit[xx][yy]=0; //恢复现场 for(j=1; j<=MM[i].ti; j++) //每走一步都会进行判断一下 { if(dd==0) xx++; if(dd==1) yy++; if(dd==2) xx--; if(dd==3) yy--; if(xx<1||xx>a||yy<1||yy>b) { flag=1; printf("Robot %d crashes into the wall\n", rr); break; } if(visit[xx][yy]) { flag=1; printf("Robot %d crashes into robot %d\n", rr, visit[xx][yy]); break; } } if(flag) break; R[rr].x=xx, R[rr].y=yy; visit[xx][yy]=rr; } if(MM[i].ai[0]=='L') { int dd=R[rr].dir; dd=(dd+MM[i].ti)%4; R[rr].dir=dd; } if(MM[i].ai[0]=='R') { int dd=R[rr].dir; dd=(dd-MM[i].ti%4+4)%4; R[rr].dir=dd; } } if(i==m+1) printf("OK\n"); } return 0; }