P14803 [CCPC 2024 哈尔滨站] 在哈尔滨指路 个人题解
题目大意
给定用东西南北表示的路线,让你使用左右和直行来表示
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;
}

浙公网安备 33010602011771号