题目链接:
P1563 [NOIP2016 提高组] 玩具谜题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
https://www.luogu.com.cn/problem/P1563
转向分析:
解析:
从题目可以知道玩具小人逆时针1~n围成圈,将圆圈转换成一维数组存放。对于一维数组来说,逆时针转向的下标是升序排列的,顺时针转向的下标是降序排列的。
圆圈是这样的:
顺时针的数组下标:n-1,...,3,2,1,0;
逆时针的数组下标:0,1,2,3,...,n-1;
然后就可以根据表格里的转向变化来改变数组下标了。
代码:
#include<iostream>
using namespace std;
const int N = 1e6 + 5;
struct node {
int head;//玩具小人的方向
string occa;//玩具小人的职业
} a[N];
int n, m, x, y;
int main() {
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> a[i].head >> a[i].occa;
}
int now = 0;//记录当前玩具小人下标
for (int i = 1; i <= m; i++) {
cin >> x >> y;
if ((a[now].head == 0 && x == 1 ) || (a[now].head == 1 && x == 0)) {
now = (now + y) % n;//下标升序数
} else if ((a[now].head == 1 && x == 1) || (a[now].head == 0 && x == 0)) {
now = (now + n - y) % n;//下标降序数(加n取余防止出现负数下标)
}
}
cout << a[now].occa;
return 0;
}
如有错误,欢迎提出,感谢指正👍