洛谷P1563 [NOIP2016 提高组] 玩具谜题

题目链接:https://www.luogu.com.cn/problem/P1563

哈哈哈,这个题拿来一读是不是很吃惊hahaha,我刚开始读的时候吓了我一跳,这么长的题干,这么绕的题意,还有下面的子任务数据,好吓人,认为是一个难题。

其实,不必惊慌,这个题是一思路很清晰的模拟题。模拟一下就知道了。

首先,我们要开始中规中矩的输入n,m,在中规中矩的输入名字和朝向,题目要求我们输入一个整形数字和一个字符串,这个用结构体struct来解决即可。

大致过程如图:

 

下面开始模拟:

题目规定,

朝内——0,左——0;顺时针

朝内——0,右——1;逆时针

朝外——1,左——0;逆时针

朝外——1,右——1;顺时针。

为了方便理解,我们画一下图(画的很烂哦)

理解的差不多了吧(不理解可以自己动一下手哦),我们模拟完成后根据题目定义一个状态,根据题目所给出的朝向和转向,完成模拟运算,最后输出结果

注意:我们在这里采用位运算的异或法则,规定,逆时针是+,顺时针是-;

那么这个题就可以解决了。

代码及注意事项如下:

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int t;//toward朝向 
    string name;//小人的名字 
}p[100010];//要定义的大于10010哦,否则会RE
int x,y;
int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    for(int i=0;i<n;i++)
    {
        cin>>p[i].t>>p[i].name;//中规中矩的输入 
    }
    int numz=0;//转向以及经过左右数的方位,我们首先从最初方位开始 
    for(int i=0;i<m;i++)
    {
        scanf("%d %d",&x,&y);
        if(p[numz].t==0&&x==0)
        {
            numz=(numz-y+n)%n;//为什么要加n呢,因为如果要是数的个数过大,会造成负数的情况,所以说加上一个n就可以保证是正数了 
         } 
         else if(p[numz].t==0&&x==1)
         {
             numz=(numz+y)%n;//环形操作要%n,保证不会超限 
         }else if(p[numz].t==1&&x==0)
         {
             numz=(numz+y)%n;//同理 
         }else if(p[numz].t==1&&x==1)
         {
             numz=(numz+n-y)%n;//同理 
         }
    }
    cout<<p[numz].name<<endl;//输出最终方位 
    return 0;
}

 

posted @ 2022-02-11 14:38  江上舟摇  阅读(76)  评论(0编辑  收藏  举报