洛谷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;
}

 

Tags: