洛谷题单指南-模拟和高精度-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];
}

 

posted @ 2024-01-17 16:59  五月江城  阅读(14)  评论(0编辑  收藏  举报