基本思路
小人面朝方向和左右的方向做异或操作来确定顺时针或逆时针,把顺时针的操作通过对小人人数n的补来转换成逆时针操作。
为了防止出现数一圈以上的情况对小人人数n需要取余。
C++ 代码
#include<iostream>
using namespace std;
int main(){
int n, m;
cin>> n >> m;
int face[n]; //这个小人面朝哪里,0为圈内,1为圈外
string prof[n]; //职业名
int dir; //方向,0为左,1为右
int nth; //需要数几个小人
int res = 0; //答案的下标
for(int i = 0; i < n; i++) cin >> face[i] >> prof[i];
for(int i = 0; i < m; i++){
cin >> dir >> nth;
int d = dir ^ face[res]; //异或,如果d为1说明是逆时针数
if(d == 1) res = ( res + ( nth % n)) % n;
else res = ( res + ( n - ( nth % n ))) % n; //把顺时针的情况转成逆时针
}
cout<< prof[res];
}