P14803 [CCPC 2024 哈尔滨站] 在哈尔滨指路 个人题解

题目链接

题目大意

给定用东西南北表示的路线,让你使用左右和直行来表示

Solution

这是一道模拟题,只要顺着他给定的方向走就行,但是对于像我一样出门不分南北东西的人来说有点困难。

首先可以发现给定的路线不会出现相邻的相反指令,比如南后面就是北,东后面就是西这类的,那么路线改变时一定是发生了一次向左走或向右走。那么其实转变成左右指令时,原本的一条指令就会被拆成两条指令,分别为转向和直行距离,如果我们第一次面向的方向就是原第一条指令的方向时,第一条指令就只需要直行距离这条指令代替就行,那么总指令数为 \(1+2*(n-1)\)

然后我们就开始进行转向操作,为了照顾像我一样的路痴,下面是一张方向标:

我们可以通过看这张图防止自己绕晕,具体来说为:

  1. 如果面朝北方,那么左转是西,右转是东。
  2. 如果面朝东方,那么左转是北,右转是南。
  3. 如果面朝南方,那么左转是东,右转是西。
  4. 如果面朝西方,那么左转是南,右转是北。

然后就是按照这个模拟就好了,具体看代码。

代码

#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;
}
posted @ 2025-12-20 17:59  See_you_soon  阅读(1)  评论(0)    收藏  举报