C++でN×Nチェス盤に配置できるビショップの最大数を求める方法
問題概要
チェス盤のサイズを表す整数 N が入力として与えられます。この問題では、任意の N に対して、N×N のチェス盤上に互いに攻撃し合わないようにビショップ(bishop)を最大何個配置できるかを求めます。
まず、具体例を使って理解していきましょう。
例1
入力: N = 2
出力: N×N チェス盤に配置できるビショップの最大数 ― 2
説明: 2×2 のチェス盤の場合、互いに干渉しない位置は図示された場所のみです。つまり、2×2 の盤面に配置できるビショップは最大 2 個となります。
例2
入力: N = 5
出力: N×N チェス盤に配置できるビショップの最大数 ― 8
プログラムで使用するアプローチ
- チェス盤のサイズとして整数値 N を入力として受け取ります。
- この N を引数として totalBishops(int n) 関数に渡します。
- N < 1 の場合は無効な入力とみなし、ビショップの数は 0 とします。
- N = 1 の場合、配置できるマスは 1 つだけなので、ビショップの数は 1 となります。
- それ以外の場合、ビショップの数は 2 × (N − 1) となります。
- 計算結果を変数 bishops に格納します。
- 結果を返します。
ポイント: ビショップは斜め方向にしか移動できないため、同じ色のマスに複数置くと衝突する可能性があります。しかし、盤面の外周(最外周の2列)をうまく利用することで、2 × (N − 1) 個まで衝突なく配置できることが数学的に証明されています。
コード例
#include <iostream>
// 配置可能なビショップの最大数を返す関数
int totalBishops(int n){
int bishops = 0;
if (n < 1)
bishops = 0;
else if (n == 1)
bishops = 1;
else
bishops = 2 * (n - 1);
return bishops;
}
int main(){
int N = 15; // チェス盤のサイズ N×N
printf("%d", totalBishops(N));
return 0;
}
出力
上記のコードを実行すると、以下の出力が生成されます。
28
N = 15 の場合、2 × (15 − 1) = 28 となり、15×15 のチェス盤には最大 28 個のビショップを互いに攻撃し合わないように配置できることがわかります。このアルゴリズムの時間計算量は O(1)、空間計算量も O(1) と非常に効率的です。
-
C++でN個のセグメントを使って7セグメントディスプレイに表示できる最大の数を求める方法
問題の概要 この記事では、7セグメントディスプレイに対してN個のセグメントを使用したときに、表示できる最大の数を求める方法を解説します。 まず、具体例を使って何をすべきかを確認しましょう。 入力 − N=5 出力 − 71 説明 − この場合、最大の数は7セグメントディスプレイ上で次のように表示されます。 入力 − N=6 出力 − 111 アルゴリズムのアプローチ この問題は、次の3つの場合に分けて考えることができます。 ケース1 −Nが0または1の場合、どの数字も表示できません。 ケース2 −Nが奇数の場合です。奇数個のセグメントで表示できる数字は2、3、5、7、8であり、その中で最
-
C++で直角二等辺三角形に収まる正方形の最大数を求める方法
この記事では、底辺の長さが「s」である直角二等辺三角形の中に、一辺「a」の正方形を最大でいくつ収めることができるかを求める問題を解説します。二等辺三角形とは、少なくとも2つの等しい辺を持つ三角形のことです。 まず、具体例を使って何をすべきかを理解しましょう。 入力例 s=5, a=1 出力 10 説明 − 底辺に並べられる正方形の数は、「s を a で割って 1 を引く」ことで求められます。つまり、底辺の正方形の数 = 5/1 − 1 = 4 個です。 同様に、最下段に4つの正方形を配置すると、その上に底辺が (s−a) の新しい二等辺三角形ができます。同じ手順を繰り返すと3個、さらにその上