洛谷题单指南-模拟和高精度-P1563 [NOIP2016 提高组] 玩具谜题
原题链接:https://www.luogu.com.cn/problem/P1563
题意解读:
本题关键在于根据小人的朝向和寻找的方向来确定数组下标的变化。
用数组存储小人,int d[]存朝向,int a[]存名称,朝向和寻找方向有4种组合:
朝向(0:向内,1:向外) | 寻找方向(0:左,1:右) | 数组下标操作 |
0 | 0 | 顺时针寻找,下标递减 |
0 | 1 | 逆时针寻找,下标递增 |
1 | 0 | 逆时针寻找,下标递增 |
1 | 1 | 顺时针寻找,下标递减 |
总结一下,如果朝向^方向=1,则下标递增,如果朝向^方向=0,则下标递减。
注意:数组下标增减时,要处理越界问题,采用循环数组的方式处理即可,设数组长度为n,当前下标为from,变化量为num,
增加时:from = (from + num) % n, 减少时:from = (from - num + n) % n。
100分代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
string a[N]; // 玩具小人的名称,逆时针方向对应数组递增
int d[N]; // 玩具小人的朝向,0:向内 1:向外
int n, m;
int main()
{
cin >> n >> m;
for(int i = 0; i < n; i++)
{
cin >> d[i] >> a[i];
}
int dir; //左右
int num; //数几个
int from = 0; //从第1个人开始
for(int i = 0; i < m; i++)
{
cin >> dir >> num;
if((d[from] ^ dir) == 1) from = (from + num) % n; // 如果小人的朝向和寻找的方向异或为1,则往数组递增的方向寻找
else from = (from - num + n) % n; // 如果小人的朝向和寻找的方向异或为0,则往数组递减的方向寻找
}
cout << a[from];
}