`
mayi_hetu
  • 浏览: 14464 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

poj2632模拟法

    博客分类:
  • poj
阅读更多

/*

模拟机器人在方格中运动,判断是否会发生碰撞

题目的思路挺简单的,需要注意方格的表示和语言中矩阵的表示的区别,判断行进的位置

 做这道题目是还理解了一下C结构体中数据的内存对齐问题,在定义结构体是最好是遵守字节对齐原则,

简单说就是长字节的先定义,这样可以节省一些空间

 */

#include<stdio.h>
#include<string.h>

#define MAX 130

char m[MAX][MAX];
struct Robot
{
 int x;
 int y;
 int d;
}r[MAX];


int main()
{
 int K,A,B,N,M;
 int i,j,pos,repeat,flag,p,x,y;
 char ch;
 freopen("data","r",stdin);
 scanf("%d",&K);
 for(i=0;i<K;++i)
 {
  memset(m,0,sizeof(m)); 
  scanf("%d%d",&A,&B);
  scanf("%d%d",&N,&M);
  for(j=1;j<=N;++j)
  {
   scanf("%d %d %c",&r[j].x,&r[j].y,&ch);
   switch(ch)
   {
    case 'E':r[j].d=0;break;
    case 'N':r[j].d=1;break;
    case 'W':r[j].d=2;break;
    case 'S':r[j].d=3;break;
   }
   m[ r[j].x ][ r[j].y ]=j;
  }
  flag = 0;
  for(j=0;j<M;++j)
  {
   scanf("%d %c %d",&pos,&ch,&repeat);
   if(!flag)
   switch(ch)
   {
    case 'L':r[pos].d = (r[pos].d+repeat)%4;
       break;
    case 'R':r[pos].d = (r[pos].d+3*repeat)%4;
       break;
    case 'F':
       switch(r[pos].d)
       {
        case 0:x=1;y=0;break;
        case 1:x=0;y=1;break;
        case 2:x=-1;y=0;break;
        case 3:x=0;y=-1;break;
       }
       for(p=0;p<repeat;++p)
       {
        m[ r[pos].x ][ r[pos].y ]=0;
        r[pos].x+=x;
        r[pos].y+=y;
        if(r[pos].x<1 || r[pos].x>A || r[pos].y<1 || r[pos].y>B)
        {
         printf("Robot %d crashes into the wall\n",pos);
         flag=1;
         break;
        }else if(m[ r[pos].x ][ r[pos].y ]!=0)
        {
         printf("Robot %d crashes into robot %d\n",pos,m[ r[pos].x ][ r[pos].y ]);
        flag =1;
        break;
        }else
        {
         m[ r[pos].x ][ r[pos].y ] = pos;
        }
       }
       break;
   }
  }
  if(!flag)
  {
   printf("OK\n");
  }

 }


}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics