洛谷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; }
本文来自博客园,作者:江上舟摇,转载请注明原文链接:https://www.cnblogs.com/LQS-blog/p/15883141.html