天天看點

玩具謎題(NOIP2016)

題目連結:玩具謎題

提高組日常水題。

直接模拟,有需要注意的點會在代碼後講解:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    int dirt[n];
    char name[n][];
    for(int i=;i<n;i++){
        char x;
        scanf("%d",&dirt[i]);
        scanf("%c",&x);       //1
        scanf("%s",name[i]);
    }
    int cur=;                //2
    for(int i=;i<m;i++){
        int a,b;
        scanf("%d%d",&a,&b);
        if(a+dirt[cur]==){      //3
            cur+=b;
        }else{
            cur-=b;
        }
        if(cur<){              //4
            cur+=n;
        }else if(cur>=n){
            cur-=n;
        }
    }
    printf("%s",name[cur]);
    return ;
}
           

隻提4處:

1處:這是為了把數字與名字之間的空格讀入扔掉,為以後輸出省了一點事(好像更麻煩了?無所謂,你自己抉擇。)

2處:cur代表目前走到哪個小人

3處:自己畫個圖就明白了為什麼這麼寫。

4處:防止越界。

順便提一下:如果有的人讨厭用字元串,還可以用rewind()函數,來移動檔案流指針,也就是說,讀入名字不記錄,等計算出第幾個人後,回去再讀出來是第幾個人。