【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小时左转一次(即逆时针的下一个方向)。

两只兔子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\n",st.x,st.y);
101         printf("%d %d\n",sj.x,sj.y);
102     }
103     return 0;
104 }

 

目录
相关文章
|
5月前
|
Java SEO
Leetcode 582. Kill Process 题解
大概说下题意,给出n个进程,每个进程都有一个唯一的进程号,每个进程只有一个父进程,但一个进程可能有多个子进程,我们用pid和ppid两个list来保存所有的进程和其父进程。每当杀死一个进程的时候,其全部子进程都必须被杀死,现在给出一个进程pid,让你找出杀死它时候必须杀死哪些进程?以list返回。
22 0
HDU-1282,回文数猜想(简单模拟)
HDU-1282,回文数猜想(简单模拟)
HDOJ 1339 A Simple Task(简单数学题,暴力)
HDOJ 1339 A Simple Task(简单数学题,暴力)
95 0
HDOJ(HDU) 1562 Guess the number(水题,枚举就行)
HDOJ(HDU) 1562 Guess the number(水题,枚举就行)
97 0
|
Java
HDU 1711 Number Sequence(KMP裸题,板子题,有坑点)
Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 27028    Accepted Submission...
974 0