题目链接
题目梗概
有n个小人围成一圈,有的朝内有的朝外。给出一串指示,如第一个人的左数第3个人的右数第1个人的左数第2个人。返回这个人的名字。
解题思路
虽然朝向有向内和向外,指示有向左和向右,两两组合共有四种情况,但实际上方向只有逆时针和顺时针两种方向。
内0外1 | 左0右1 | 顺0逆1 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
从表格中可以看出顺逆方向是内外左右的异或运算结果。
设下标指针为0,小人信息时是按照逆时针输入的的,当方向是逆时针时,下标增大,顺时针时,下标减小。
小人是围成圈的,所以当下标超过人数或者下标为负数时,需要通过取模等操作修正到正确的下标。
完整代码
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int main(){
int n, m;
cin >> n >> m;
vector<int> outward(n);
vector<string> job(n);
for(int i = 0;i < n; ++i){
cin >> outward[i] >> job[i];
}
int idx = 0, dir, num;
for(int i = 0;i < m; ++i){
cin >> dir >> num;
if(dir^outward[idx] == 1){
idx += num;
}else{
idx -= num;
}
if(idx < 0) idx = n - (int)abs(idx)%n;
if(idx >= n) idx %= n;
}
cout << job[idx];
return 0;
}