题目链接
题目大意
给定用东西南北表示的路线,让你使用左右和直行来表示
Solution
这是一道模拟题,只要顺着他给定的方向走就行,但是对于像我一样出门不分南北东西的人来说有点困难。
首先可以发现给定的路线不会出现相邻的相反指令,比如南后面就是北,东后面就是西这类的,那么路线改变时一定是发生了一次向左走或向右走。那么其实转变成左右指令时,原本的一条指令就会被拆成两条指令,分别为转向和直行距离,如果我们第一次面向的方向就是原第一条指令的方向时,第一条指令就只需要直行距离这条指令代替就行,那么总指令数为 \(1+2*(n-1)\)。
然后我们就开始进行转向操作,为了照顾像我一样的路痴,下面是一张方向标:
我们可以通过看这张图防止自己绕晕,具体来说为:
- 如果面朝北方,那么左转是西,右转是东。
- 如果面朝东方,那么左转是北,右转是南。
- 如果面朝南方,那么左转是东,右转是西。
- 如果面朝西方,那么左转是南,右转是北。
然后就是按照这个模拟就好了,具体看代码。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+6;
inline int read(){int x=0,f=1;char c=getchar();while(c<'0' || c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0' && c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}
struct Node{char c;int x;
}s[N];
int T=read();
int main(){while(T--){int n=read();for(int i=1;i<=n;i++){cin>>s[i].c;s[i].x=read();}printf("%d %c\nZ %d\n",1+(n-1)*2,s[1].c,s[1].x);//初始朝向为第一条指令的方向 char last=s[1].c;for(int i=2;i<=n;i++){if(last=='N'){//面朝北方if(s[i].c=='E') puts("R");//右转是东else if(s[i].c=='W') puts("L");//左转是西} else if(last=='E'){//面朝东方if(s[i].c=='S') puts("R");//右转是南else if(s[i].c=='N') puts("L");//左转是北}else if(last=='S'){//面朝南方if(s[i].c=='W') puts("R");//右转是西else if(s[i].c=='E') puts("L");//左转是东}else if(last=='W'){//面朝西方if(s[i].c=='N') puts("R");//右转是北else if(s[i].c=='S') puts("L");//左转是南}printf("Z %d\n",s[i].x);last=s[i].c;}}return 0;
}