【HDU 4452 Running Rabbits】简单模拟

时间:2023-03-08 17:45:52
【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小时到达同一点,则交换彼此的方向再走下一小时;若相遇时有兔子恰好该左转,则放弃此次左转。

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

 #include <cstdio>
#include <algorithm>
using namespace std; struct Status
{
int x,y,d,h;//坐标,方向。当前时间
}st,sj; int n,k;
char dir_t,dir_j;
int speed_t,speed_j;
int turn_t,turn_j; void go_next(Status &s,int speed)
{
s.h++;
int cnt=;
switch(s.d)//由于speed<n,所以最多只碰壁折返一次,并且两只兔子不会在一小时内相遇两次(但其实可能在走向下一个格子的过程中遇到。。。)
{
case :
while(s.y<n&&cnt<speed){s.y++; cnt++;}
if(cnt<speed)
{
s.y-=speed-cnt;
s.d=;
}break;
case :
while(s.x>&&cnt<speed){s.x--; cnt++;}
if(cnt<speed)
{
s.x+=speed-cnt;
s.d=;
}break;
case :
while(s.y>&&cnt<speed){s.y--; cnt++;}
if(cnt<speed)
{
s.y+=speed-cnt;
s.d=;
}break;
case :
while(s.x<n&&cnt<speed){s.x++; cnt++;}
if(cnt<speed)
{
s.x-=speed-cnt;
s.d=;
}
}
} int main()
{
freopen("4452.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
if(n==) break;
getchar();
scanf("%c",&dir_t);
scanf("%d%d",&speed_t,&turn_t);
getchar();
scanf("%c",&dir_j);
scanf("%d%d",&speed_j,&turn_j);
scanf("%d",&k); st.x=st.y=;
st.h=sj.h=;
sj.x=sj.y=n;
st.d=turn_t;
sj.d=turn_j;
switch(dir_t)
{
case 'E':st.d=;break;
case 'N':st.d=;break;
case 'W':st.d=;break;
case 'S':st.d=;break;
}
switch(dir_j)
{
case 'E':sj.d=;break;
case 'N':sj.d=;break;
case 'W':sj.d=;break;
case 'S':sj.d=;break;
} while(k--)
{
if(st.x==sj.x&&st.y==sj.y)
swap(st.d,sj.d);
else
{
if(st.h!=&&st.h%turn_t==)
st.d=(st.d+)%;
if(sj.h!=&&sj.h%turn_j==)
sj.d=(sj.d+)%;
}
go_next(st,speed_t);
go_next(sj,speed_j);
}
printf("%d %d\n",st.x,st.y);
printf("%d %d\n",sj.x,sj.y);
}
return ;
}