洛谷P1563 [NOIP2016 提高組] 玩具謎題
題目鏈接://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; }