ABC204 A 解答
A - Rock-paper-scissors(7)
問題
問題文
サーバル、フェネック、アライグマの 3 人がじゃんけんをして、あいこになりました。
フェネックが出した手を表す文字 x とアライグマが出した手を表す文字
y が与えられます。それぞれ、0 はグー、1 はチョキを、2 はパーを表します。
サーバルが出した手を表す文字を出力してください。なお、答えは一意に定まります。
制約
x, y は 0, 1, 2 のいずれか
考察
3人でじゃんけんをします。そしたらどうやらあいこだったみたいです。
2人の出した手はわかってますので、そこからもう1人の手を求めましょう。
手の状況は次の2つに分かれます。
1)2人が同じ手だった場合
このときは、3人目も同じ手になりますね。ですので、1人目でも2人目でもどちらでもいいので、その手を出力しましょう。
2)異なる手だった場合
このときは1人目とも2人目とも異なる手を出せば正解です。色々とやり方はありますが、if文で書いてしまうのが一番単純ですかね。
上記の2通りを書いてあげればACです。実装しましょう。
実装
#include<bits/stdc++.h>
#define rep(i,n) for(int i=0;i<n;++i)
#define reps(i,s,n) for(int i=s;i<n;++i)
using namespace std;
using ll = long long;
using P = pair<int, int>;
int main()
{
int x, y;
cin >> x >> y;
if (x == y) cout << x << endl;
else
{
if (x == 0 && y == 1) cout << 2 << endl;
else if (x == 0 && y == 2) cout << 1 << endl;
else if (x == 1 && y == 0) cout << 2 << endl;
else if (x == 1 && y == 2) cout << 0 << endl;
else if (x == 2 && y == 0) cout << 1 << endl;
else if (x == 2 && y == 1) cout << 0 << endl;
}
return 0;
}
あとがき
今回はif文で書きましたが、もうちょっと効率を求めましょう。どうやら「ぐーちょきぱー」はそれぞれ1、2、3と割り振られているようですので、それを利用します。
2人の手が異なるときは3人目も異なる手を出す必要があります。ということはみんな違う手を出しています。それがあいこのルールです。ですので、みんなの手の合計は3になります。ということで、3から1人目と2人目の手を引いてあげれば、if文を少なくできます。私はコンテスト中はこの方法で解きました。
さらに効率の良い方法としましては
(6-x-y)%3
というものがあるみたいです。これなら同じかどうかの判定も必要ありません。どう考えたらこの式が出てくるんですかね。とっても不思議です。
シンプルですが色々な考え方のできる良い問題でした。
この記事が気に入ったらサポートをしてみませんか?