C++で2点間の格子点(整数座標の点)の数を求める方法
はじめに
このチュートリアルでは、与えられた2つの点の間に存在する整数座標の点(格子点)の数を求めるプログラムをC++で作成します。
2点を結ぶ線分上の格子点の数は、次の式で求めることができます。
gcd(abs(x1 - x2), abs(y1 - y2)) - 1
ただし、線分が座標軸に平行な場合は特別な扱いが必要です。
- x軸に平行な場合(両点のy座標が等しい): 格子点の数は
abs(x1 - x2) - 1 - y軸に平行な場合(両点のx座標が等しい): 格子点の数は
abs(y1 - y2) - 1
つまり、両方の点のy座標が一致していれば線分はx軸に平行となり、x座標が一致していればy軸に平行となります。
入力例
pointOne = [1, 5] pointTwo = [1, 3]
出力例
1
この例では、両点のx座標がどちらも1なので、線分はy軸に平行です。したがって、abs(5 - 3) - 1 = 1 という結果になります。
アルゴリズム
- 2つの点を初期化します。
- 線分がx軸に平行かどうか(y座標が等しいか)を確認します。平行であれば
abs(x1 - x2) - 1を返します。 - 線分がy軸に平行かどうか(x座標が等しいか)を確認します。平行であれば
abs(y1 - y2) - 1を返します。 - どちらの軸にも平行でない場合は、
gcd(abs(x1 - x2), abs(y1 - y2)) - 1を計算します。 - 結果を出力します。
C++での実装
以下は、上記のアルゴリズムをC++で実装したコードです。
#include <bits/stdc++.h>
using namespace std;
// ユークリッドの互除法による最大公約数の計算
int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
int getCount(int pointOne[], int pointTwo[]) {
// x座標が等しい場合(y軸に平行)
if (pointOne[0] == pointTwo[0]) {
return abs(pointOne[1] - pointTwo[1]) - 1;
}
// y座標が等しい場合(x軸に平行)
if (pointOne[1] == pointTwo[1]) {
return abs(pointOne[0] - pointTwo[0]) - 1;
}
// それ以外の場合
return gcd(abs(pointOne[0] - pointTwo[0]), abs(pointOne[1] - pointTwo[1])) - 1;
}
int main() {
int pointOne[] = {1, 3}, pointTwo[] = {10, 12};
cout << getCount(pointOne, pointTwo) << endl;
return 0;
}
出力
上記のコードを実行すると、次の結果が得られます。
8
この例では、gcd(abs(1 - 10), abs(3 - 12)) - 1 = gcd(9, 9) - 1 = 8 となるため、答えは8になります。
-
C++で五胞体数(ペンタトープ数)を求める方法
五胞体数とは? 五胞体数(ペンタトープ数)は、パスカルの三角形の第5の対角線上に現れる数列として知られています。この数列を定義するには、パスカルの三角形に少なくとも5つの数が必要となるため、数列の最初の数はパスカルの三角形の第4行である 1 4 6 4 1 から始まります。 本チュートリアルでは、n番目の五胞体数を求める方法を解説します。まずは具体的な例を見てみましょう。 入力 : 1出力 : 1入力 : 4出力 : 35 以下の図から出力を確認できます。 この問題は数列に関するものなので、解法ではまず数列のパターンを見つけることから始めます。 解法のアプローチ このプログラムでは、数列の
-
C++で二分探索木(BST)の2つのノード間の最大要素を求める方法
問題文 N個の要素を持つ配列と、その配列に含まれる2つの整数 A、B が与えられます。まず、配列の要素 arr[0] から arr[n-1] を順番に挿入して二分探索木(BST:Binary Search Tree)を構築します。その上で、ノード A からノード B への経路上に存在する最大の要素を見つけることが本問題の目的です。 例 配列が {24, 23, 15, 36, 19, 41, 25, 35} の場合、構築されるBSTは次のようになります。 ここで A = 19、B = 41 とした場合、この2つのノード間の最大要素は 41 となります。 アルゴリズム この問題は、BST