zoukankan      html  css  js  c++  java
  • poj 2632 Crashing Robots 模拟

    题目链接:

      http://poj.org/problem?id=2632

    题目描述:

      有一个B*A的厂库,分布了n个机器人,机器人编号1~n。我们知道刚开始时全部机器人的位置和朝向,我们可以按顺序操控机器人,没有两个机器人可以同时执行命令。如果机器人走到厂库边界,他将碰到墙,如果两个机器人走到同一位置,则表示他们两个相撞。问m个命令内最先发生的碰撞,如果没有碰撞输出“OK”。

    解题思路:

      由图可知,本题的矩阵与平时的不太一样,所以我们在对厂库进行操作的时候,可以先把厂库顺时针旋转90°,当然,方向也要跟着旋转90°。左右方向是不会跟着变的。然后老老实实的按照命令去模拟,就大功告成啦。

    代码:

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <cstdlib>
     4 #include <iostream>
     5 using namespace std;
     6 
     7 #define maxn 105
     8 
     9 struct node
    10 {
    11     int x, y, s;
    12 } stu[maxn];//每个机器人的位置(x,y),和方向s
    13 
    14 int dir[4][2] = {-1,0, 0,1, 1,0, 0,-1};//翻转后的四个方向:W,N,E,S
    15 int map[maxn][maxn];
    16 
    17 int main()
    18 {
    19     int t, A, B, n, m, i, j, flag, x, y, num1, num2;
    20     char ch[2];
    21 
    22     scanf ("%d", &t);
    23     while (t --)
    24     {
    25         flag = 0;//是否发生碰撞
    26         scanf ("%d %d", &A, &B);
    27         scanf ("%d %d", &n, &m);
    28         memset (map, 0, sizeof(map));
    29         for (i=1; i<=n; i++)
    30         {
    31             scanf ("%d %d %s", &stu[i].x, &stu[i].y, ch);
    32             if (ch[0] == 'W')
    33                 stu[i].s = 0;
    34             else if (ch[0] == 'N')
    35                 stu[i].s = 1;
    36             else if (ch[0] == 'E')
    37                 stu[i].s = 2;
    38             else
    39                 stu[i].s = 3;
    40             map[stu[i].x][stu[i].y] = i;
    41         }
    42 
    43         while (m --)
    44         {
    45             scanf ("%d%s%d", &x, ch, &y);
    46             if (flag)
    47                 continue;
    48             if (ch[0] == 'L')//对机器人进行转弯
    49             {
    50                 stu[x].s -= y % 4;//这里有可能是负数,会导致下面运行re,必须要处理
    51                 stu[x].s = (stu[x].s + 4) % 4;
    52             }
    53             else if (ch[0] == 'R')
    54             }
    55                 stu[x].s += y;
    56                 stu[x].s = (stu[x].s + 4) % 4;
    57             }
    58             else
    59             {
    60                 map[stu[x].x][stu[x].y] = 0;
    61                 while (y --)//一定要对沿途经过的地方进行判断,是否会有碰撞发生
    62                 {
    63                     stu[x].x = stu[x].x + dir[stu[x].s][0];
    64                     stu[x].y = stu[x].y + dir[stu[x].s][1];
    65                     if (stu[x].x<=0 || stu[x].x>A || stu[x].y<=0 || stu[x].y>B)//是否碰撞到墙
    66                     {
    67                         num1 = x;
    68                         flag = 1;
    69                         break;
    70                     }
    71                     else if (map[stu[x].x][stu[x].y])//是否碰撞到别的机器人
    72                     {
    73                         num1 = x;
    74                         num2 = map[stu[x].x][stu[x].y];
    75                         flag = 2;
    76                         break;
    77                     }
    78                 }
    79                 map[stu[x].x][stu[x].y] = x;
    80             }
    81         }
    82         if (! flag)
    83             printf ("OK
    ");
    84         else if (flag == 1)
    85             printf ("Robot %d crashes into the wall
    ", num1);
    86         else
    87             printf ("Robot %d crashes into robot %d
    ", num1, num2);
    88     }
    89     return 0;
    90 }

      

    本文为博主原创文章,未经博主允许不得转载。
  • 相关阅读:
    H5+ 分享到微信、朋友圈代码示例
    H5+ 重写在线升级版本比较代码
    H5+ a页面打开b页面,b页面加载成功后关闭当前页面,闪屏的规避解决方案
    MUI
    MUI
    MUI
    MUI
    Vue实战之【企业开发常见问题】
    step1:准备歌词之《前端开发是个啥》
    element-ui级联选择器(Cascader)获取级联对象 (主要是想获取:label值)
  • 原文地址:https://www.cnblogs.com/alihenaixiao/p/4176378.html
Copyright © 2011-2022 走看看