C++でnラウンド制ゲームの勝者を判定するコード
2人のプレイヤーが対戦するnラウンド制のゲームを考えてみましょう。各ラウンドのスコアは配列「scores」で与えられ、各要素は{P1のスコア, P2のスコア}という形式になっています。各ラウンドではスコアが高い方のプレイヤーがそのラウンドに勝利し、より多くのラウンドを制したプレイヤーがゲーム全体の勝者となります。両者の勝利数が同じ場合は引き分けと判定されます。
この記事では、与えられたスコアをもとに、誰がゲームに勝ったのかを判定するプログラムをC++で実装します。
例えば、入力が n = 4、scores = {{4, 3}, {3, 2}, {5, 6}, {2, 5}} の場合、出力は「Draw(引き分け)」になります。
解法のアプローチ
この問題は、各ラウンドの結果を数値化して合計することでシンプルに解決できます。具体的には、P1がラウンドに勝ったら +1、P2が勝ったら -1、引き分けなら 0 を加算していき、最終的な合計値の符号で勝者を判定します。
手順は以下の通りです。
res := 0
n が 0 になるまで繰り返し:
a := scores[n] の1つ目の値(P1のスコア)
b := scores[n] の2つ目の値(P2のスコア)
res := res + (a > b なら 1、a < b なら -1、それ以外は 0)
n := n - 1
res > 0 なら "P1"、res < 0 なら "P2"、それ以外は "Draw" を返すC++での実装例
それでは、上記の手順を実際のC++コードで確認してみましょう。
#include <bits/stdc++.h>
using namespace std;
#define N 100
string solve(int n, vector<pair<int, int>> scores) {
int res = 0;
while(n--){
int a = scores[n].first;
int b = scores[n].second;
res += (a > b ? 1 : (a < b ? -1 : 0));
}
return res > 0 ? "P1" : (res < 0 ? "P2" : "Draw");
}
int main() {
int n = 4;
vector<pair<int, int>> scores = {{4, 3}, {3, 2}, {5, 6}, {2,5}};
cout<< solve(n, scores);
return 0;
}入力
4, {{4, 3}, {3, 2}, {5, 6}, {2, 5}}出力
Draw
コードの解説
このプログラムでは、solve関数が各ラウンドのスコアペアを順番に取り出し、三項演算子を使ってラウンドごとの結果を +1 / -1 / 0 として累積変数 res に加算しています。ループ終了後、res の値が正であれば P1 の勝ち、負であれば P2 の勝ち、ゼロであれば引き分けとして文字列を返します。
上記の入力例では、第1ラウンドと第2ラウンドをP1が、第3ラウンドと第4ラウンドをP2が制しており、勝利数が2対2で並ぶため、出力は「Draw」となります。
このアルゴリズムの計算量はO(n)で、ラウンド数に比例して処理時間が増えるだけなので、非常に効率的です。
-
グラフ内のスーパー頂点を見つけるC++プログラムの解説
問題の概要n個の頂点を持つグラフが与えられていると仮定しましょう。頂点には1からnまでの番号が付けられており、配列「edges」に含まれる辺によって互いに接続されています。さらに、各頂点は1からnの範囲の数値である「x」という値を持ち、その値は配列「values」で与えられます。このとき、グラフの中から「スーパー頂点(super vertex)」と呼ばれる特別な頂点を見つけ出す必要があります。頂点iがスーパー頂点であるとは、頂点1から頂点iへの最短経路上に、i番目の頂点と同じ「x」の値を持つ頂点が存在しないことを意味します。この条件を満たすすべての頂点を出力してください。たとえば、入力が n
-
C++でグレイコード(Gray Code)を生成するアルゴリズムと実装例
グレイコード(Gray Code)とは、隣り合う2つの値が必ず1ビットだけ異なるという性質を持つ二進数体系のことです。本記事では、コードのビット数を表す非負整数 n が与えられたときに、グレイコードの列を出力する方法を解説します。グレイコードの列は必ず 0 から始まる必要があります。例えば、入力が 2 の場合、出力は [0, 1, 3, 2] となります。これは、0 のグレイコードが 00、1 が 01、2 が 11、3 が 10 であるためです。隣接する値同士を比較すると、それぞれ1ビットしか変わっていないことが確認できます。解法のアプローチこの問題は、以下の手順で解くことができます。結果を