【模拟】玩具谜题 luogu-1563

题目描述

小南有一套可爱的玩具小人, 它们各有不同的职业。
有一天, 这些玩具小人把小南的眼镜藏了起来。 小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外。如下图:

这时singer告诉小南一个谜題: “眼镜藏在我左数第3个玩具小人的右数第11个玩具小人的左数第22个玩具小人那里。 ”
小南发现, 这个谜题中玩具小人的朝向非常关键, 因为朝内和朝外的玩具小人的左右方向是相反的: 面朝圈内的玩具小人, 它的左边是顺时针方向, 右边是逆时针方向; 而面向圈外的玩具小人, 它的左边是逆时针方向, 右边是顺时针方向。
小南一边艰难地辨认着玩具小人, 一边数着:
singer朝内, 左数第33个是archer。
archer朝外,右数第11个是thinker。
thinker朝外, 左数第22个是writer。
所以眼镜藏在writer这里!
虽然成功找回了眼镜, 但小南并没有放心。 如果下次有更多的玩具小人藏他的眼镜, 或是谜題的长度更长, 他可能就无法找到眼镜了 。 所以小南希望你写程序帮他解决类似的谜題。 这样的谜題具体可以描述为:
有n个玩具小人围成一圈, 已知它们的职业和朝向。现在第1个玩具小人告诉小南一个包含m条指令的谜題, 其中第z条指令形如“左数/右数第 s,个玩具小人”。 你需要输出依次数完这些指令后,到达的玩具小人的职业。

分析

简单模拟一下,如果方向相同,那么就转。

AC代码

#include <bits/stdc++.h>
using namespace std;
const int maxn=100005;
struct rec{
	int x;
	char s[11];
}a[maxn];
int n,m;
inline int read(){
	int X=0,w=0;char ch=0;
	while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
	while(isdigit(ch)) {X=(X<<1)+(X<<3)+(ch^48);ch=getchar();}
	return w?-X:X;
}
int main(){
	n=read(),m=read();
	for (int i=0;i<n;i++) {
		a[i].x=read();
		scanf("%s",a[i].s);
	}
	int now=0;
	for (int i=0;i<m;i++) {
		int d=read(),y=read();
		if (a[now].x==d) y*=-1;
		now=(now+y+n)%n;
	}
	printf("%s",a[now].s);
	return 0;
}
黎明的朝阳,会为苦难中最坚强的信念升起
原文地址:https://www.cnblogs.com/Dawn-Star/p/9635704.html