两只兔子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 }