题意:给一个n*n的格子,1在左上角,2在右下角,每个人有一个初始速度和方向,若遇到边缘,则朝相反方向前进,若两个人相遇则交换方向(注意方向改变后,人仍然需要移动),同时,每个人每过t1,t2时间就会朝左转向,求K秒时那个人所在的方向
模拟,看起来比较麻烦,实际写起来还是比较好写的
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<queue> 6 #include<map> 7 using namespace std; 8 #define MOD 1000000007 9 const double eps=1e-5; 10 #define cl(a) memset(a,0,sizeof(a)) 11 #define ts printf("*****\n"); 12 const int MAXN=1005; 13 int n,m,tt,K,v1,v2; 14 int dir1,dir2,t1,t2; //0北,1西,2南,3东 15 int x1,y1; 16 int x2,y2; 17 void fun(int t) 18 { 19 if(x1==x2&&y1==y2) swap(dir1,dir2); 20 else 21 { 22 if(t!=0&&t%t1==0) dir1+=1,dir1%=4; 23 if(t!=0&&t%t2==0) dir2+=1,dir2%=4; 24 } 25 26 for(int i=0;i<v1;i++) 27 { 28 if(dir1==0&&x1==1)dir1=2; 29 if(dir1==1&&y1==1)dir1=3; 30 if(dir1==2&&x1==n)dir1=0; 31 if(dir1==3&&y1==n)dir1=1; 32 33 if(dir1==0)x1--; 34 else if(dir1==1)y1--; 35 else if(dir1==2)x1++; 36 else y1++; 37 } 38 for(int i=0;i<v2;i++) 39 { 40 if(dir2==0&&x2==1)dir2=2; 41 if(dir2==1&&y2==1)dir2=3; 42 if(dir2==2&&x2==n)dir2=0; 43 if(dir2==3&&y2==n)dir2=1; 44 45 if(dir2==0)x2--; 46 else if(dir2==1)y2--; 47 else if(dir2==2)x2++; 48 else y2++; 49 } 50 } 51 int main() 52 { 53 int i,j,k; 54 #ifndef ONLINE_JUDGE 55 freopen("1.in","r",stdin); 56 #endif 57 while(scanf("%d",&n)!=EOF) 58 { 59 if(n==0) break; 60 char di[5]; 61 x1=1,y1=1; 62 x2=n,y2=n; 63 64 65 scanf("%s%d%d",di,&v1,&t1); 66 if(di[0]==‘N‘) dir1=0; 67 else if(di[0]==‘W‘) dir1=1; 68 else if(di[0]==‘S‘) dir1=2; 69 else dir1=3; 70 71 72 scanf("%s%d%d",di,&v2,&t2); 73 if(di[0]==‘N‘) dir2=0; 74 else if(di[0]==‘W‘) dir2=1; 75 else if(di[0]==‘S‘) dir2=2; 76 else dir2=3; 77 78 79 scanf("%d",&K); 80 for(i=0;i<K;i++) 81 { 82 fun(i); //每秒钟的运动情况 83 } 84 printf("%d %d\n",x1,y1); 85 printf("%d %d\n",x2,y2); 86 } 87 }
时间: 2024-10-11 02:53:18