POJ 2632 模拟题

模拟题,不是很恶心。

算法:

1.写好各种操作函数Turn_Left, Turn_Right, Forward

2.处理好各种细节,我wa,主要是由机器编号求其坐标时搞错,还有Turn是没有注意次数。

View Code
#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, &times);
        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编辑  收藏  举报

导航