大致題意不難理解,注意幾點細節。
轉向觸發條件:
⑴ 一個小時走完後向左轉;
⑵ 碰到牆向後轉;
⑶ 兩只兔子都走完一個小時的路後(即當時間K為整數時),如果相遇,就交換方向,並且不再向左轉。(之前一直以為走的過程中相遇也可以交換方向,一直wa)
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int dx[]= {0,-1,0,1}; //方向順序為N,W,S,E。這是為了方便向左轉
int dy[]= {-1,0,1,0};
int n;
int time;
struct Coo
{
int x;
int y;
} coo[2];
struct Rabbit
{
int di;
int v;
int turn;
} rabbit[2];
void solve()
{
coo[0].x=coo[0].y=1;
coo[1].x=coo[1].y=n;
for(int i=1; i<=time; i++)
{
bool flag1=true;
for(int j=0; j<rabbit[0].v; j++) //一步一步走,不能往前走轉向
{
int x=coo[0].x;
int y=coo[0].y;
int di=rabbit[0].di;
if((x==1 && di==1) || (x==n && di==3) || (y==1 && di==0) || (y==n && di==2))
rabbit[0].di=di=(di+2)%4; //向後轉
coo[0].x=x+dx[di];
coo[0].y=y+dy[di];
}
for(int j=0; j<rabbit[1].v; j++)
{
int x=coo[1].x;
int y=coo[1].y;
int di=rabbit[1].di;
if((x==1 && di==1) || (x==n && di==3) || (y==1 && di==0) || (y==n && di==2))
rabbit[1].di=di=(di+2)%4;
coo[1].x=x+dx[di];
coo[1].y=y+dy[di];
}
if(coo[0].x==coo[1].x && coo[0].y==coo[1].y)
{
int direct;
direct=rabbit[0].di;
rabbit[0].di=rabbit[1].di;
rabbit[1].di=direct;
flag1=false;
}
if(i%rabbit[0].turn==0 && flag1)
rabbit[0].di=(rabbit[0].di+1)%4; //向左轉
if(i%rabbit[1].turn==0 && flag1)
rabbit[1].di=(rabbit[1].di+1)%4;
}
printf("%d %d\n%d %d\n",coo[0].y,coo[0].x,coo[1].y,coo[1].x);
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d",&n),n)
{
for(int i=0; i<2; i++)
{
char c;
getchar();
scanf("%c%d%d",&c,&rabbit[i].v,&rabbit[i].turn);
if(c=='N')rabbit[i].di=0; //將方向轉化為數字,向左轉的話+1再模4,向後轉+2再模4
else if(c=='W')rabbit[i].di=1;
else if(c=='S')rabbit[i].di=2;
else if(c=='E')rabbit[i].di=3;
}
scanf("%d",&time);
solve();
}
return 0;
}