P1563 [NOIP2016 提高组] 玩具谜题
程序员文章站
2024-03-19 09:25:16
...
题目链接
https://www.luogu.com.cn/problem/P1563传送门
具体题目我就不复制了,大家自己去链接看。
我们可以发现
朝外(1),左(0):逆时针,+
朝外(1),右(1):顺时针,-
朝内(0),左(0):顺时针,-
朝内(0),右(1):逆时针,+
所以用个异或就ok了。异或结果不为0 ++,为0 --;
建立两个数组,一个记录朝向,一个记录姓名。然后直接求下标,相当于环形链表。
代码
#include <bits/stdc++.h>
using namespace std;
int main(){
int m,n;
cin >> m >> n;
int l[m];
string s[m];
int ans = 0;
for(int i = 0;i < m;i++) cin >> l[i] >> s[i];
int a,b;
for(int i = 0;i <n;i++){
cin >> a >> b;
if(a ^ l[ans]) ans = (ans + m + b) % m;// 加 m 保证下标是正的情况下进行+
else ans = ((ans + m - b) % m + m) % m;// 取模后再加 m 保证下标不为负
}
cout << s[ans];
return 0;
}