POJ 2632 模拟题
模拟题,不是很恶心。
算法:
1.写好各种操作函数Turn_Left, Turn_Right, Forward
2.处理好各种细节,我wa,主要是由机器编号求其坐标时搞错,还有Turn是没有注意次数。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<string.h> #include<stdlib.h> #include<stdio.h> using namespace std; int T, A, B, N, M, maxn; int mp[110][110]; //存储机器人位置,值0表示该坐标无机器人,1表示方向E,2表示S,3表示W,4表示N int hash[1011010]; //由坐标映射机器人编号 void debug( ) { freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); } //向左转 void Turn_Left(int a, int b, int val) { if( val == 1 ) mp[a][b] = 4; else mp[a][b] = val - 1; } //向右转 void Turn_Right(int a, int b, int val) { if( val == 4 ) mp[a][b] = 1; else mp[a][b] = val + 1; } //前进,碰到墙返回1,碰到机器人返回2,OK则返回0 int Forward( int a, int b, int val ,int times, int &Num) { int i; mp[a][b] = 0; int x = hash[(a-1) * maxn + b]; hash[(a-1) * maxn + b] = 0; if( val == 1 ) //向东 { for(i = a; i <= a + times; i++) { if( mp[i][b] && i <= A ) //碰撞 { Num = hash[(i - 1) * maxn + b];//该机器人编号 return 2; } } //printf("i = %d A = %d\n", i, A); if( i - 1 > A ) //碰墙 return 1; mp[i-1][b] = val; hash[ (i - 2) * maxn + b ] = x; // printf("%d %d %d temp = %d\n", a, i-1, x, (a - 1) * A + i -1); } else if( val == 2 ) //向南走 { for( i = b; i >= b- times; i--) { if( mp[a][i] && i > 0 ) //碰撞 { Num = hash[(a -1) * maxn + i];//该机器人编号 return 2; } } if( i + 1 < 1 ) //碰墙 return 1; mp[a][i+1] = val; hash[(a - 1) * maxn + i + 1] = x; } else if( val == 3 ) //向西走 { for(i = a; i >= a - times; i--) { if( mp[i][b] && i > 0 ) //碰撞 { Num = hash[(i - 1) * maxn + b];//该机器人编号 return 2; } } if( i + 1 < 1 ) //碰墙 return 1; mp[i+1][b] = val; hash[i * maxn + b ] = x; } else if( val == 4 ) //向北走 { for(i = b; i <= b + times; i++) { // printf("** i = %d b = %d\n", i, b); if( mp[a][i] && i <= B ) //碰撞 { Num = hash[(a - 1) * maxn + i];//该机器人编号 return 2; } } if( i - 1 > B ) //碰墙 return 1; mp[a][i-1] = val; hash[ (a- 1) * maxn + i -1 ] = x; } return 0; } void find( int &x, int &y, int value) { for( int i = 0; i <= 1000010; i++) { if( hash[i] == value ) { if( i % maxn != 0 ) y = i % maxn; else y = maxn; x = (i - y) / maxn + 1; // printf("x = %d y = %d i = %d\n", x, y,i); break; } } } int main( ) { int a, b; char str[10]; //debug(); scanf("%d",&T); while(T--) { scanf("%d%d",&A,&B); maxn = max( A, B); scanf("%d%d",&N,&M); memset(mp, 0, sizeof(mp)); memset(hash, 0, sizeof(hash)); // maxn = 0; for( int i = 1; i <= N; i++) { scanf("%d%d%s",&a,&b,&str); if( str[0] == 'E' ) mp[a][b] = 1; else if( str[0] == 'S') mp[a][b] = 2; else if( str[0] == 'W' ) mp[a][b] = 3; else mp[a][b] = 4; int temp = (a-1) * maxn + b; hash[temp] = i; } int robot, times, f = 0, Num1, Num2; char action[10]; for( int i = 1; i <= M; i++) { scanf("%d%s%d", &robot, &action, ×); if( !f ) { //由robot得到其位置a,b find( a, b, robot ); //printf("ins:%d %d num = %d %d\n", a, b, robot, mp[a][b]); Num1 = robot; if( action[0] == 'L' ) { for( int i = 1; i <= times % 4; i++) Turn_Left(a, b, mp[a][b]); //printf("%d %d %d\n", a, b, mp[a][b]); } else if( action[0] == 'R' ) { for( int i = 1; i <= times % 4; i++) Turn_Right(a, b, mp[a][b]); } else { f = Forward(a, b, mp[a][b],times, Num2); } } } if ( f == 0 ) puts("OK"); else if( f == 1 ) printf("Robot %d crashes into the wall\n",Num1); else if( f == 2 ) printf("Robot %d crashes into robot %d\n", Num1, Num2); } return 0; }
posted on 2012-07-09 21:25 more think, more gains 阅读(167) 评论(0) 编辑 收藏 举报