C++で水槽にn個の球体ボールを沈めたときに水が溢れるかどうかを判定するプログラム
円柱形の水槽の半径と高さ、沈める球体ボールの個数「n」とそれぞれの半径、さらに水槽内の現在の水量が与えられたとき、ボールをすべて水槽に沈めた際に水が溢れる(オーバーフローする)かどうかを判定するのが本記事の目的です。
体積を求める公式
円柱(水槽)の場合
3.14 * r * r * h
ここで、rは水槽の半径、hは水槽の高さを表します。
球体(ボール)の場合
(4/3) * 3.14 * R * R * R
ここで、Rは球体ボールの半径を表します。
入力例
tank_height = 5 tank_radius = 2 water_volume = 10 capacity = 10 ball_radius = 2
出力例
It will overflow
判定までの流れ(アプローチ)
- 水槽の半径や高さ、沈めるボールの個数、ボールの半径などの各パラメータを入力として受け取ります
- 公式を用いて水槽の容量(容積)を計算します
- 公式を用いて球体1個分の体積を計算します
- ボールを水に沈めるたびに水位が上昇するため、現在の水量を考慮します
- 水量とボール全体の体積を合計した総体積を求めます
- 総体積と水槽の容量を比較し、オーバーフローの有無を判定します
- 総体積が容量より大きい場合 → 水槽から水が溢れます
- 総体積が容量より小さい場合 → 水は溢れません
アルゴリズム
Step 1→ 水槽がオーバーフローするかどうかを判定する関数を宣言
void overflow(int H, int r, int h, int N, int R)
float型 tank_cap = 3.14 * r * r * H を宣言
float型 water_vol = 3.14 * r * r * h を宣言
float型 balls_vol = N * (4 / 3) * 3.14 * R * R * R を宣言
float型 vol = water_vol + balls_vol を宣言
IF (vol > tank_cap)
「it will overflow」と表示
End
Else
「No it will not overflow」と表示
End
Step 2→ main() 内での処理
int型 tank_height = 5, tank_radius = 2, water_volume = 10,
capacity = 10, ball_radius = 2 を宣言
overflow(tank_height, tank_radius, water_volume, capacity, ball_radius) を呼び出すC++による実装例
#include <bits/stdc++.h>
using namespace std;
// 水槽がオーバーフローするかどうかを判定する関数
void overflow(int H, int r, int h, int N, int R){
float tank_cap = 3.14 * r * r * H;
float water_vol = 3.14 * r * r * h;
float balls_vol = N * (4 / 3) * 3.14 * R * R * R;
float vol = water_vol + balls_vol;
if (vol > tank_cap){
cout<<"it will overflow";
}
else{
cout<<"No it will not overflow";
}
}
int main(){
int tank_height = 5, tank_radius = 2, water_volume = 10, capacity = 10, ball_radius = 2;
overflow(tank_height, tank_radius, water_volume, capacity, ball_radius);
return 0;
}出力結果
上記のコードを実行すると、以下の出力が得られます。
it will overflow
補足:より正確な計算のために
サンプルコードでは (4 / 3) の部分が整数同士の除算となるため、計算結果が「1」に丸められてしまう点に注意が必要です。球の体積を正確に求めるには、(4.0 / 3.0) のように浮動小数点数で記述しましょう。また、円周率についても M_PI や 3.14159 など、より高精度な値を使用することで計算全体の精度が向上します。
-
BFS(幅優先探索)で無向グラフの連結性を判定するC++プログラム
グラフの連結性とは グラフが連結(接続)されているかどうかを調べるには、何らかのグラフ探索アルゴリズムを使って、すべてのノードを訪問できるかどうかを確認します。探索を完了した時点で未訪問のノードが1つでも残っていれば、そのグラフは連結していないことになります。 無向グラフの場合は、任意の1つのノードを選び、そこから探索を開始します。本記事では、探索アルゴリズムとして幅優先探索(BFS:Breadth-First Search)を採用しています。 入力と出力の例 入力 − グラフの隣接行列 0110010110110110110100110 出力 − 「グラフは連結しています。」 アルゴリズム
-
DFS(深さ優先探索)による有向グラフの連結性チェック ― C++プログラム解説
グラフの連結性チェックの基本概念 グラフが連結しているかどうかを調べるには、何らかの探索アルゴリズムを用いてすべてのノードを巡回してみます。探索が完了した時点で、まだ一度も訪問されていないノードが残っていれば、そのグラフは連結ではないと判断できます。 有向グラフの場合のポイント 無向グラフと異なり、有向グラフの場合はすべてのノードを起点として探索を行う必要があります。理由は、あるエッジが外向きの辺しか持たず、内向きの辺を持たないケースが存在するためです。そのようなノードは、他のどのノードを出発点としても到達できない可能性があります。 本記事では、探索アルゴリズムとして再帰的なDFS(深さ優先