POJ 2632 Crashing Robots(模拟)

谁借莪1个温暖的怀抱¢ 2022-05-17 04:42 254阅读 0赞

题目链接

题目大意:有一些机器人,给出了它们的初始位置以及朝向,再给出一些指令用来改变这些机器人的朝向或者位置,在所有指令完成之后,输出机器人的情况,有三种,越界输出“Robot x crashes into the wall”,碰撞到其他机器人“Robot x crashes into robot y”,或者两者都没有,输出“OK”。

分析:很明显,四个方向,我们可以用四个数字来表示,每次转向,就相应地加减取模即可,注意:在越界之前如果和其它机器人发生了碰撞,也是需要输出第二种的,所以只能一步一步走,每走一步需要检验当前是越界了还是发生碰撞了,所以可以将判断越界和发生碰撞写在同一个函数中,使程序更加简洁。刚开始我写得巨复杂,然后参考了网上的简洁代码,我真的好弱啊TAT。。。

  1. #include<map>
  2. #include<set>
  3. #include<cmath>
  4. #include<queue>
  5. #include<stack>
  6. #include<cstdio>
  7. #include<vector>
  8. #include<cctype>
  9. #include<cstring>
  10. #include<utility>
  11. #include<cstdlib>
  12. #include <iomanip>
  13. #include<iostream>
  14. #include<algorithm>
  15. #define inf 0x3f3f3f3f
  16. #define Clear(x) memset(x,0,sizeof(x))
  17. #define fup(i,a,b) for(int i=a;i<b;i++)
  18. #define rfup(i,a,b) for(int i=a;i<=b;i++)
  19. #define fdn(i,a,b) for(int i=a;i>b;i--)
  20. #define rfdn(i,a,b) for(int i=a;i>=b;i--)
  21. typedef long long ll;
  22. using namespace std;
  23. const double pi=acos(-1.0);
  24. const int maxn = 1e2+7;
  25. const double eps = 1e-8;
  26. int A,B,n,m,flag;
  27. struct node{
  28. int x,y,fac;
  29. }a[maxn];
  30. void check(int x,int y,int id)
  31. {
  32. if(x==0||x==A+1||y==0||y==B+1)
  33. flag=0,printf("Robot %d crashes into the wall\n",id);
  34. else
  35. {
  36. int c=0;
  37. rfup(i,1,n)
  38. {
  39. if(i==id) continue;
  40. else if(a[i].x==x&&a[i].y==y) c=i;
  41. }
  42. if(c)
  43. {
  44. printf("Robot %d crashes into robot %d\n",id,c);
  45. flag=0;
  46. }
  47. }
  48. }
  49. void change(int id,char op,int cnt)
  50. {
  51. if(!flag) return;
  52. if(op=='L'){
  53. a[id].fac=(a[id].fac-cnt%4+4)%4;/**负数一定要先mod了后再加再mod*/
  54. }else if(op=='R'){
  55. a[id].fac=(a[id].fac+cnt)%4;
  56. }else{
  57. while(cnt--)
  58. {
  59. if(a[id].fac==0)
  60. {
  61. a[id].y++;
  62. }
  63. if(a[id].fac==1)
  64. {
  65. a[id].x++;
  66. }
  67. if(a[id].fac==2)
  68. {
  69. a[id].y--;
  70. }
  71. if(a[id].fac==3)
  72. {
  73. a[id].x--;
  74. }
  75. check(a[id].x,a[id].y,id);
  76. if(!flag) break;
  77. }
  78. }
  79. }
  80. int main()
  81. {
  82. int T,x,y;
  83. char c;
  84. scanf("%d",&T);
  85. while(T--)
  86. {
  87. Clear(a);
  88. cin>>A>>B;
  89. flag=1;
  90. cin>>n>>m;
  91. rfup(i,1,n)
  92. {
  93. cin>>x>>y>>c;
  94. a[i].x=x,a[i].y=y;
  95. switch(c)
  96. {
  97. case 'N': a[i].fac=0;break;
  98. case 'E': a[i].fac=1;break;
  99. case 'S': a[i].fac=2;break;
  100. case 'W': a[i].fac=3;break;
  101. default: break;
  102. }
  103. }
  104. rfup(i,1,m)
  105. {
  106. cin>>x>>c>>y;
  107. if(flag) change(x,c,y);
  108. }
  109. if(flag) cout<<"OK"<<endl;
  110. }
  111. return 0;
  112. }

发表评论

表情:
评论列表 (有 0 条评论,254人围观)

还没有评论,来说两句吧...

相关阅读

    相关 POJ - 1835 - 模拟

    题目链接:[POJ-1835][] 题目大意: 宇航员在太空中行走,给定一个三维坐标系(x,y,z轴的正方向标号分别为0,1,2,负方向标号分别为3,4,5),他的起始位置