-
双方向探索(Bidirectional Search)とは?仕組みとC++実装例を徹底解説
双方向探索(bidirectional search)とは、2つの方向から同時に探索を実行するグラフ探索手法です。1つ目の探索は始点(ソース)からゴールへ向かって順方向に進み、2つ目の探索はゴールから始点へ向かって逆方向に進みます。理想的な状況では、両方の探索はデータ構造の途中で出会うことになります。双方向探索アルゴリズムは有向グラフ上で動作し、始点(初期ノード)からゴールノードまでの最短経路を求めます。2つの探索はそれぞれの出発点から開始され、両方の探索が同じノード上で出会った時点でアルゴリズムは停止します。双方向アプローチの重要性双方向探索は、一方向だけの探索よりも高速な手法であり、グラフ
-
C++ STLのasinh()関数とは?使い方とサンプルコードを解説
asinh()関数とはasinh()関数は、C++標準ライブラリ(<cmath>ヘッダ)に含まれる数学関数の一つです。asinh(value)は逆双曲線正弦(アークハイパボリックサイン)を計算し、sinh(x) = valueを満たすxの値をラジアン単位で返します。数学的には、asinh(x) = ln(x + √(x² + 1)) という式で定義されます。構文asinh(value);パラメータ引数には、逆双曲線正弦を求めたい数値を指定します。負の値、正の値、ゼロのいずれでも問題ありません。パラメータの型はdouble、float、long doubleに対応しています。戻り値入
-
C++で複素数の逆双曲線余弦を求めるacosh()関数の使い方
acosh()関数とはacosh()は逆双曲線余弦(アークハイパボリックコサイン)を計算する関数で、引数として渡された値の逆双曲線余弦を返します。実数に対しては<cmath>ヘッダーで定義されていますが、複素数を扱う場合は<complex>ヘッダーに用意されたテンプレート版の関数を使用します。この関数は複素数型に対応するようオーバーロードされているため、複素数を直接引数に渡すことができます。構文複素数の逆双曲線余弦を計算するための関数は、次のように宣言されています。template<class T> complex<T> acosh (const
-
C++ STL(標準テンプレートライブラリ)とは?3大コンポーネントの基本を解説
C++のSTL(Standard Template Library:標準テンプレートライブラリ)は、C++で広く使われるアルゴリズムやデータ構造を汎用的なテンプレートクラスとして提供する強力なライブラリです。vector(可変長配列)、list(リスト)、queue(キュー)、stack(スタック)など、頻繁に利用されるクラスや関数が含まれています。STLは「コンテナ」「アルゴリズム」「イテレータ」から構成される汎用ライブラリであり、すべての部品がテンプレートによってパラメータ化されています。そのため、STLを使いこなすには、テンプレートクラスに関する基礎知識が前提となります。テンプレートとは
-
【C++】BogoSort(ボゴソート/順列ソート)の実装プログラム
ボゴソート(Bogosort)は、配列が整列するまで要素をランダムにシャッフルし続けるという、非常にシンプルな仕組みのソートアルゴリズムです。順列と組み合わせの考え方に基づいた非効率な手法であることから、「順列ソート(Permutation Sort)」とも呼ばれています。また、その非効率さから「ショットガンソート」「バカソート(Stupid Sort)」「モンキーソート」「スローソート」といった別名でも知られています。このアルゴリズムは、入力データの順列を次々と生成し、たまたま整列された並びが出現するまで処理を繰り返します。入力:53421 出力:12345アルゴリズムの仕組みボゴソートの動
-
カクテルソートとは?C++での実装プログラムをわかりやすく解説
カクテルソート(Cocktail Sort)とはカクテルソートは、バブルソートの改良版の一種で、安定なソートアルゴリズムかつ比較ソートに分類されます。「双方向バブルソート」「カクテルシェーカーソート」「シェーカーソート」「リップルソート」「シャッフルソート」「シャトルソート」など、複数の名前で呼ばれることもあります。通常のバブルソートとの最大の違いは、リストを通過するたびに前方向と後ろ方向の両方でソートを行う点です。これにより、配列の末尾付近にある小さな要素も早く正しい位置へ移動でき、バブルソートよりも効率が改善される場合があります。入出力例入力:53421出力:12345アルゴリズムの仕組み
-
【C++入門】2つの数の最大公約数(GCD)を求めるプログラムの書き方
最大公約数(GCD:Greatest Common Divisor)とは、2つの整数に共通する約数の中で最も大きい数のことです。まずは「公約数」という概念から確認していきましょう。公約数と最大公約数とはある数の約数とは、その数を余りなく割り切ることができる整数のことです。例として、12と18の約数を見てみます。12の約数:1, 2, 3, 4, 6, 1218の約数:1, 2, 3, 6, 9, 18この両方に共通して現れる数、すなわち公約数は「1, 2, 3, 6」です。そして、その中で最も大きい「6」が最大公約数となります。数学では、2つの整数 a と b の最大公約数を (a, b) と
-
C++で実装するコムソート(Comb Sort)アルゴリズムの解説とサンプルコード
コムソート(Comb Sort)は、バブルソートやカクテルソートに似たソートアルゴリズムです。大きな特徴は、隣接する要素同士を比較するのではなく、一定間隔(ギャップ)だけ離れた要素同士を比較していく点にあります。ギャップは [n/c] として定義されます。ここで n は要素数、c は縮小係数(シュリンクファクター)です。各反復処理が終わるたびにギャップを c で割り、切り捨てていきます。これを繰り返し、最終的にはギャップが1、つまり隣接する要素同士の比較になります。入力:5 3 4 2 1 出力:1 2 3 4 5コムソートの仕組みコムソートでは、まず大きめのギャップで離れた要素同士を比較・交
-
2つ以上の数値(配列)の最大公約数(GCD)を求めるC++プログラム
2つの数の「公約数」とは、その両方の数を割り切ることができる数のことです。例えば、12の約数は 1、2、3、4、6、12 です。18の約数は 1、2、3、6、9、18 です。したがって、12と18の共通の約数(公約数)は 1、2、3、6 となり、その中で最も大きいものが「最大公約数(GCD: Greatest Common Divisor)」と呼ばれます。数学では、2つの整数 a と b の最大公約数は gcd(a, b) と表記され、この場合 gcd(12, 18) = 6 となります。最大公約数はさまざまな場面で重要な役割を果たします。例えば、2つの数の「最小公倍数(LCM: Least
-
ノームソートのC++プログラム:仕組みと実装例をわかりやすく解説
ノームソート(Gnome Sort)は、挿入ソートによく似たソーティングアルゴリズムの一つです。ただし、要素を本来あるべき位置へ移動させる方法として、バブルソートと同じように「隣接する要素の一連の交換(スワップ)」を用いる点が特徴となっています。入力: 53421 出力: 12345アルゴリズムの解説ノームソートでは、隣接する2つの要素を比較し、順序が崩れている場合にはそれらを交換しながら、各要素を徐々に正しい位置へ移動させていきます。複雑なデータ構造や再帰処理を必要とせず、単純なループだけで実装できるシンプルさが魅力のアルゴリズムです。動作の流れ先頭から順に、隣り合う2つの要素を比較します。
-
Xで割り切れる最大のK桁の数を求めるC++プログラム
2つの整数 X と K が与えられます。ここで K は桁数を表します。この問題の目的は、Xで割り切れる最大のK桁の数を見つけることです。入力:X = 30, K = 3 出力:980考え方出力例の 980 は、30で割り切れる最大の3桁の数です。この問題は次の手順で解くことができます。まず、10 の K 乗から 1 を引くことで、K桁の数の最大値(MAX)を求めます。例:K = 3 の場合、10³ − 1 = 999次に、MAX を X で割った余り(MAX % X)を MAX から引きます。これにより、Xで割り切れる最大のK桁の数が得られます。余りを引くという操作により、MAX 以下でかつ
-
更新なしの範囲合計クエリを高速に処理するC++プログラム
問題概要配列のインデックス i から j までの要素の合計を求める必要があります。i と j の値からなるクエリは複数回実行されることを想定します。入力: arr[] = {5, 6, 3, 4, 1}、i = 1、j = 3 出力: 13考え方:累積和(Prefix Sum)を活用する最も単純な方法は、i 番目から j 番目までループで順に足し合わせることですが、クエリの数が多い場合には非常に非効率です。そこで役立つのが累積和です。これは、配列の先頭から順に要素を加算していった値を別の配列に格納しておく手法です。累積和配列 sum を前計算しておけば、区間 [i, j] の合計は次の式で O
-
C++で実装する再帰バブルソート:プログラムと仕組みをわかりやすく解説
バブルソートは、隣接する2つの要素を比較し、順序が正しくない場合に入れ替え(スワップ)を行うことで配列を整列させる基本的なソートアルゴリズムです。この記事で紹介するのはその再帰版で、自分自身を呼び出す「再帰関数」を使ってソートを実現します。 入力:5 3 4 2 1出力:1 2 3 4 5 アルゴリズムの流れ 再帰的なバブルソートでは、以下の手順で処理が進みます。 1回のパスで配列を先頭から走査し、隣接する要素を比較します。 前の要素が次の要素より大きければ、両者を入れ替えます。 パスが終わると、最も大きい要素が配列の末尾に確定します。 その後、関数が自分自身を呼び出し、未整列の部分(要素数
-
C++で競技プログラミングのコードを短縮する方法|typedefとマクロ活用術
競技プログラミングでは、限られた時間の中でいかに素早くコードを記述できるかが重要です。そのため、長い型名や頻繁に使う処理を短く書く「コード短縮テクニック」が重宝されます。この記事では、typedef やマクロ(#define)を活用した代表的な短縮方法を、サンプルコード付きで解説します。 typedef で型名を短縮する 競技プログラミングでは、オーバーフロー対策として 64 ビット整数型の long long を使う場面が非常に多くあります。しかし、その都度「long long」と入力するのは手間です。そこで typedef を使って短い別名を定義しましょう。 通常のコード #inclu
-
C++ STLで使える知られざる便利テクニック集
この記事では、C++のSTL(標準テンプレートライブラリ)に関連する、あまり知られていない実用的なテクニックを紹介します。競技プログラミングや日常のコーディングで役立つ内容ばかりなので、ぜひ覚えておきましょう。 波括弧「{}」を使ったpairへの代入 pairに値を代入するとき、make_pair()を使わなくても波括弧「{}」で直接初期化できます。入れ子になったpairやtupleにも同じ書き方が使えます。 pair<int, int> my_pair = make_pair(10, 20); pair<int, int> my_pair2 = {10, 20};
-
C++におけるstd::vectorと配列の違い:vectorの利点と欠点を徹底解説
C++では、std::vectorと従来の配列(array)のどちらを使うべきか迷うことがあります。この記事では、vectorが配列と比べて持つ利点と欠点を、具体的なコード例とともにわかりやすく解説します。vectorと配列の基本的な違いテンプレートクラス vs 言語組み込み機能:vectorはC++標準ライブラリが提供するテンプレートクラスであり、C++特有の構成要素です。一方、配列は言語に組み込まれた機能であり、C言語をはじめとする多くのプログラミング言語に存在します。実装方式の違い:vectorはリストインターフェースを持つ動的配列として実装されています。配列は、静的または動的な方法で確
-
C++で指定された合計値となるすべての一意なトリプレットを見つける方法
今回は、配列の中から3つの要素を選び、その合計が指定された値と一致する「トリプレット(三つ組)」をすべて見つけるという、興味深い問題を解説します。問題の概要いくつかの要素を含む配列と、目標となる合計値が与えられます。この中から合計が指定値と等しくなる3つの要素の組み合わせをすべて抽出するのがタスクです。例えば、配列が {4, 8, 63, 21, 24, 3, 6, 1, 0} で、合計値 S = 27 が与えられた場合、条件を満たすトリプレットは {0, 3, 24}、{0, 6, 21}、{1, 5, 21} となります。条件を満たす組み合わせが複数存在する場合は、それらをすべて出力します
-
C++で3辺の長さが与えられた三角形の外接円の面積を求める方法
C++で三角形の外接円の面積を計算する 本記事では、3辺の長さが分かっている三角形について、その外接円(3つの頂点すべてを通る円)の面積をC++で求める方法を解説します。 下図のように、辺ABの長さをa、辺BCの長さをb、辺CAの長さをc、外接円の半径をrとします。 外接円の半径を求める公式 外接円の半径rは、3辺の長さと三角形の面積Sを用いて、次の式で表されます。 具体的な手順は以下の通りです。 まず、半周長 s = (a + b + c) / 2 を求めます。 ヘロンの公式より、三角形の面積は S = √(s(s − a)(s − b)(s − c)) で計算できます。 半径 r =
-
C++で楕円に内接する最大の正方形の面積を求める方法
この記事では、楕円に内接できる最大の正方形の面積を求める方法について解説します。楕円の中に正方形を内接させたときの位置関係は、下の図のようになります。 まず、長半径 a・短半径 b をもつ楕円の方程式は次のとおりです。 x² / a² + y² / b² = 1 ここで、内接する正方形の頂点の座標を (±x, ±y) とおきます。図形が正方形になるためには x と y が等しくなる必要があるため、x = y を上記の楕円の方程式に代入します。 これを整理すると、楕円に内接する最大の正方形の面積は、次の式で求められることになります。 面積 = 4 × (a² + b²) ÷ (a² × b²)
-
C++で正六角形に内接する最大の三角形の面積を求める方法
本記事では、正六角形に内接する最大の三角形の面積を求める方法を解説します。正六角形の一辺の長さを「a」、その内側に描ける最大の三角形の一辺の長さを「b」とします。図から分かるように、六角形の一辺を利用して三角形を作ると、その一辺は2つの部分に分けられます。このとき、2つの直角三角形が現れます。三平方の定理(ピタゴラスの定理)を用いると、次の関係が成り立ちます。つまり、正六角形に内接する最大の三角形は正三角形となり、その一辺 b は b = √3 × a で表されます。この関係を正三角形の面積の公式に代入すると、最大の三角形の面積は次の式で求められます。面積 = (√3 ÷ 4) × b2 =