Luogu C++ 言語 | P1563 おもちゃのパズル

幼い頃からC++を学びましょう!Luogu C++ の学習および試験準備プロセス中に尋ねられた質問をすべて記録し、あらゆる瞬間を記録します。

まとめ記事を添付します:LuoguのC++言語 | まとめ_プログラミング大好きコミュニケーターのブログ - CSDNブログ


[タイトル説明]

シャオナンは、それぞれ異なる職業を持つかわいいおもちゃのフィギュアのセットを持っています。

ある日、これらのおもちゃのフィギュアがシャオナンのメガネを隠しました。シャオ・ナンは、小さなおもちゃの人たちが円を作り、ある者は円の内側を向き、ある者は円の外側を向いていることに気づきました。以下に示すように:

この時、シンガーはシャオナンに「メガネは私の左から3番目のおもちゃのフィギュア、右から1番目のおもちゃのフィギュア、そして左から2番目のおもちゃのフィギュアの中に隠されています。」とパズルを出しました。

Xiaonan は、このパズルにおけるおもちゃのフィギュアの向きが非常に重要であることを発見しました。なぜなら、おもちゃのフィギュアの内側と外側を向いている左右の方向が逆であるからです。つまり、円の中のおもちゃのフィギュアに向かって、その左側が時計回りであり、右側は時計回り、右側は反時計回り、円の外側のおもちゃのフィギュアに向かって左側は反時計回り、右側は時計回りです。

シャオナンさんはおもちゃの人形を特定するのに苦労し、次のように数えました。

歌手は内側を向いており、左から3番目が射手です。

射手は外側を向いており、右から最初の人が考える人です。

思想家は外側を向いており、左から2番目が作家です。

ということで、メガネは筆者のところに隠されています!

メガネは無事回収されたものの、シャオナンさんは安心しなかった。次回、メガネを隠すおもちゃのフィギュアがもっとたくさんある場合、またはパズルが長くなる場合、メガネは見つけられない可能性があります。そこで、Xiaonan は、同様のパズルを解くのに役立つプログラムを書いてほしいと考えています。このようなパズルは、具体的には次のように説明できます。

円の中にn 個のおもちゃの人形があり  、それらの職業と向きはわかっています。ここで、最初のおもちゃ人間がシャオナンにm 個の命令を含むパズルを伝えます  。ここで、  z番目の命令は「 左/右 から s 番目のおもちゃ人間」の形式になっています。これらの指示を順番に完了して、たどり着いたおもちゃの悪役の職業を出力する必要があります。

【入力】

入力の最初の行には、おもちゃのフィギュアの数と命令の数を表す2 つの正の整数 nmが含まれています。

次の n 行は、各行に整数と文字列が含まれており、各おもちゃの悪役の方向と職業を反時計回りの順序で示します。このうち、0は円の内側を向く、1は円の外側を向くことを意味します。他の数字が表示されないことが保証されます。文字列の長さは 10 を超えず、英語の文字のみで構成され、文字列は空ではなく、それぞれの文字列が異なります。整数と文字列はスペースで区切られます。

次の m 行は、i 番目の 行に 2 つの整数 aisiが含まれており、  i 番目の 命令を表します。ai =0の場合 、 si 人を左に 数えることを意味し 、 ai =1 の場合、  si 人を右に数えることを意味します。ai 、 1≤ si < n には他の数値が出現しないことが保証されます 

【出力】

最初に読み取られた悪役から始めて m 個の命令が完了し た後に到着する悪役の職業を表す文字列を出力します。

【入力サンプル】

7 3
0 singer
0 reader
0 mengbier 
1 thinker
1 archer
0 writer
1 mogician 
0 3
1 1
0 2

【出力サンプル】

writer

【詳しいコード説明】

#include <bits/stdc++.h>
using namespace std;
struct people {
    int w;
    string name;
}p[100005];
int main()
{
    int n, m, mark=1, a, s;
    cin >> n >> m;
    for (int i=1; i<=n; i++) {
        cin >> p[i].w >> p[i].name;
    }
    for (int i=1; i<=m; i++) {
        cin >> a >> s;
        if (p[mark].w+a == 1) {
            mark = (mark + s) % n;
            if (mark==0) mark = n;
        } else {
            mark = (mark - s + n) % n;
            if (mark==0) mark = n;
        }
    }
    cout << p[mark].name;
    return 0;
}

【運用結果】

7 3
0 singer
0 reader
0 mengbier
1 thinker
1 archer
0 writer
1 mogician
0 3
1 1
0 2
writer

おすすめ

転載: blog.csdn.net/guolianggsta/article/details/132894451