题意:给一个n*n的格子,1在左上角,2在右下角,每个人有一个初始速度和方向,若遇到边缘,则朝相反方向前进,若两个人相遇则交换方向(注意方向改变后,人仍然需要移动),同时,每个人每过t1,t2时间就会朝左转向,求K秒时那个人所在的方向
模拟,看起来比较麻烦,实际写起来还是比较好写的
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<map>
using namespace std;
#define MOD 1000000007
const double eps=1e-;
#define cl(a) memset(a,0,sizeof(a))
#define ts printf("*****\n");
const int MAXN=;
int n,m,tt,K,v1,v2;
int dir1,dir2,t1,t2; //0北,1西,2南,3东
int x1,y1;
int x2,y2;
void fun(int t)
{
if(x1==x2&&y1==y2) swap(dir1,dir2);
else
{
if(t!=&&t%t1==) dir1+=,dir1%=;
if(t!=&&t%t2==) dir2+=,dir2%=;
} for(int i=;i<v1;i++)
{
if(dir1==&&x1==)dir1=;
if(dir1==&&y1==)dir1=;
if(dir1==&&x1==n)dir1=;
if(dir1==&&y1==n)dir1=; if(dir1==)x1--;
else if(dir1==)y1--;
else if(dir1==)x1++;
else y1++;
}
for(int i=;i<v2;i++)
{
if(dir2==&&x2==)dir2=;
if(dir2==&&y2==)dir2=;
if(dir2==&&x2==n)dir2=;
if(dir2==&&y2==n)dir2=; if(dir2==)x2--;
else if(dir2==)y2--;
else if(dir2==)x2++;
else y2++;
}
}
int main()
{
int i,j,k;
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
#endif
while(scanf("%d",&n)!=EOF)
{
if(n==) break;
char di[];
x1=,y1=;
x2=n,y2=n; scanf("%s%d%d",di,&v1,&t1);
if(di[]=='N') dir1=;
else if(di[]=='W') dir1=;
else if(di[]=='S') dir1=;
else dir1=; scanf("%s%d%d",di,&v2,&t2);
if(di[]=='N') dir2=;
else if(di[]=='W') dir2=;
else if(di[]=='S') dir2=;
else dir2=; scanf("%d",&K);
for(i=;i<K;i++)
{
fun(i); //每秒钟的运动情况
}
printf("%d %d\n",x1,y1);
printf("%d %d\n",x2,y2);
}
}