大致題意不難理解,注意幾點細節。
轉向觸發條件:
⑴ 一個小時走完後向左轉;
⑵ 碰到牆向後轉;
⑶ 兩只兔子都走完一個小時的路後(即當時間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; }