【国庆の礼物 之四】洛谷P1563 玩具谜题

题目:

思路:
模拟计算。我们使用pos变量记录我们走到了哪里。
我们发现,如果朝向和圈内/圈外相同,那么结果是左数。否则,结果是右数。两个条件相同/不同,可以使用异或运算符。
顺/逆时针可以使用下面的代码,注意取模计算。

pos=(pos+s)%n;
pos=(pos+n-s)%n;

需要注意,圆圈问题中数组最好用0开始计数,避免某些问题。

完整代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m;//人数,指令数 
string job[N];
int face[N];//朝向 

//0表示圈内 1表示圈外
//0表示左数 1表示右数 
int main(){
	cin>>n>>m;
	for(int i=0;i<n;i++){
		cin>>face[i]>>job[i];
	}
	int pos=0;
	for(int i=0;i<m;i++){
		int a,s;
		cin>>a>>s; //a:左右 s:数字
		if(face[pos]^a){//顺时针 
			pos=(pos+s)%n;
		} 
		else{//逆时针 
			pos=(pos+n-s)%n;
		}
	}
	cout<<job[pos]<<endl;
	return 0;
}
posted @ 2021-10-03 10:21  计算机知识杂谈  阅读(44)  评论(2编辑  收藏  举报