• 【HDU 4452 Running Rabbits】简单模拟


    两只兔子Tom和Jerry在一个n*n的格子区域跑,分别起始于(1,1)和(n,n),有各自的速度speed(格/小时)、初始方向dir(E、N、W、S)和左转周期turn(小时/次)。

    各自每小时往E、N、W、S中一个方向跑speed格,每隔turn小时左转一次(即逆时针的下一个方向)。

    行走中若第i步将碰壁,则第i步及剩余步改为原方向的相反方向(即折返)。

    两只兔子若在第i小时到达同一点,则交换彼此的方向再走下一小时;若相遇时有兔子恰好该左转,则放弃此次左转。

    第一眼像搜索,后来发现只是简单模拟~~

      1 #include <cstdio>
      2 #include <algorithm>
      3 using namespace std;
      4 
      5 struct Status
      6 {
      7     int x,y,d,h;//坐标,方向。当前时间
      8 }st,sj;
      9 
     10 int n,k;
     11 char dir_t,dir_j;
     12 int speed_t,speed_j;
     13 int turn_t,turn_j;
     14 
     15 void go_next(Status &s,int speed)
     16 {
     17     s.h++;
     18     int cnt=0;
     19     switch(s.d)//由于speed<n,所以最多只碰壁折返一次,并且两只兔子不会在一小时内相遇两次(但其实可能在走向下一个格子的过程中遇到。。。)
     20     {
     21     case 0:
     22         while(s.y<n&&cnt<speed){s.y++; cnt++;}
     23         if(cnt<speed)
     24         {
     25             s.y-=speed-cnt;
     26             s.d=2;
     27         }break;
     28     case 1:
     29         while(s.x>1&&cnt<speed){s.x--; cnt++;}
     30         if(cnt<speed)
     31         {
     32             s.x+=speed-cnt;
     33             s.d=3;
     34         }break;
     35     case 2:
     36         while(s.y>1&&cnt<speed){s.y--; cnt++;}
     37         if(cnt<speed)
     38         {
     39             s.y+=speed-cnt;
     40             s.d=0;
     41         }break;
     42     case 3:
     43         while(s.x<n&&cnt<speed){s.x++; cnt++;}
     44         if(cnt<speed)
     45         {
     46             s.x-=speed-cnt;
     47             s.d=1;
     48         }
     49     }
     50 }
     51 
     52 int main()
     53 {
     54     freopen("4452.txt","r",stdin);
     55     while(scanf("%d",&n)!=EOF)
     56     {
     57         if(n==0) break;
     58         getchar();
     59         scanf("%c",&dir_t);
     60         scanf("%d%d",&speed_t,&turn_t);
     61         getchar();
     62         scanf("%c",&dir_j);
     63         scanf("%d%d",&speed_j,&turn_j);
     64         scanf("%d",&k);
     65 
     66         st.x=st.y=1;
     67         st.h=sj.h=0;
     68         sj.x=sj.y=n;
     69         st.d=turn_t;
     70         sj.d=turn_j;
     71         switch(dir_t)
     72         {
     73             case 'E':st.d=0;break;
     74             case 'N':st.d=1;break;
     75             case 'W':st.d=2;break;
     76             case 'S':st.d=3;break;
     77         }
     78         switch(dir_j)
     79         {
     80             case 'E':sj.d=0;break;
     81             case 'N':sj.d=1;break;
     82             case 'W':sj.d=2;break;
     83             case 'S':sj.d=3;break;
     84         }
     85 
     86         while(k--)
     87         {
     88             if(st.x==sj.x&&st.y==sj.y)
     89                 swap(st.d,sj.d);
     90             else
     91             {
     92                 if(st.h!=0&&st.h%turn_t==0)
     93                     st.d=(st.d+1)%4;
     94                 if(sj.h!=0&&sj.h%turn_j==0)
     95                     sj.d=(sj.d+1)%4;
     96             }
     97             go_next(st,speed_t);
     98             go_next(sj,speed_j);
     99         }
    100         printf("%d %d
    ",st.x,st.y);
    101         printf("%d %d
    ",sj.x,sj.y);
    102     }
    103     return 0;
    104 }
  • 相关阅读:
    C#中ref和out的原理
    C#托管堆和垃圾回收(GC)
    C#类成员初始化顺序
    HTTP认证之摘要认证——Digest(二)
    HTTP认证之摘要认证——Digest(一)
    设计模式之建造者模式——Builder
    Shader专题:卡通着色(一)控制颜色的艺术
    小班同学学习经历分享(一)游戏程序员成长札记
    UniRx精讲(二):独立的 Update &UniRx 的基本语法格式
    UniRx精讲(一):UniRx简介&定时功能实现
  • 原文地址:https://www.cnblogs.com/helenawang/p/4945637.html
Copyright © 2020-2023  润新知