C++でグリッド内の魔方陣を数える
数の行列が与えられます。目標は、与えられた行列の中に存在する魔方陣の数を見つけることです。
魔方陣は、行列とすると、数独のグリッドのように1から9までの要素を含む3X3行列です。プロパティは-
- すべての番号は1回だけ発生します。
- マトリックス内の9つのセルすべての合計は45です。
- 3の各行の合計は15です。
- 3の各列の合計は15です。
- 3の対角線の合計は5です。
- このような合計を得るには、5は常に両方の対角線の中央にあります。
入力
int arr[][]= { { 1,2,3,0 }, { 4,5,6,1 }, { 7,8,9,0 } };
出力
Magic Squares present: 0
説明 −理解するためのマトリックス形式の作成-
1 | 2 | 3 | 0 |
4 | 5 | 6 | 1 |
7 | 8 | 9 | 0 |
すべての要素は1から9の間であり、一意です。しかし、
1 + 2 + 3 =6!=4 + 5 + 6 =15!=7 + 8 + 9 =23
また、対角線の合計は15に等しくありません。
入力
arr[][]= { { 1,2,3,0 }, { 4,5,6,1 }, { 7,8,9,0 } };
出力
Magic Squares present : 1
説明 −理解するためのマトリックス形式の作成-
1 | 6 | 8 | 4 |
8 | 1 | 6 | 0 |
3 | 5 | 7 | 1 |
4 | 9 | 2 | 0 |
すべての番号は一意で、1から9の範囲です。
行の合計、8 + 1 + 6 =3 + 5 + 7 =4 + 9 + 2 =15
列の合計、8 + 3 + 4 =1 + 5 + 9 =6 + 7 + 2 =15
対角線の合計、8 + 5 + 2 =4 + 5 + 6 =15
また、1を9に加えると、45になり、5は両方の対角線の中央になります。
以下のプログラムで使用されているアプローチは次のとおりです
-
整数配列Grid[][]は数値を格納し、行と列はその次元を格納します。
-
関数magicSquare(int a、intb…..inti)は、9つの要素すべてを入力として受け取り、魔方陣になるかどうかをチェックします。魔方陣の場合は1を返し、それ以外の場合は1を返します。
-
ここでは、配列arr [9]を使用してすべてのパラメーターを格納し、それらが一意のセルを占有していることを確認して、それらが一意であるかどうかを確認します。セルのカウントが1未満の場合は、いいえを意味します。が1から9の範囲にないか、カウント> 1の場合、いいえ。ユニークではありません。フラグを設定=0
-
フラグが1の場合、行、列、対角の合計が15であるかどうかを確認します。trueの場合は魔法の正方形です。1を返す場合は0を返します。
-
関数countSquares(int G [3] [4]、int R、int C)は、グリッド、その行と列を入力として受け取り、noをカウントします。そこに存在する魔方陣の数。
-
カウントは、そのような正方形の数のカウントを格納するために使用されます。
-
最初の要素から行2、列2(3X3マトリックス)までトラバースを開始します
-
対角線G[i+ 1] [j + 1]の中央が5でない場合、魔方陣は使用できません。現在の反復をスキップしてください。
-
それ以外の場合は、magicSquare(int a to i)
に渡して、9つの要素すべてをチェックします。 -
G[i][j]を含む9つの要素はすべてG[i+ 1] [j]、G [i + 2] [j]、G [i + 1] [j + 1]、G [i][j +1]、G [i] [j + 2]、G [i + 2] [j + 2]、G [i + 2] [j + 1]、G [i + 1] [j + 2]
-
1増加カウントを返す場合。
-
最終的には、希望する結果としてカウントを返します。
例
#include <bits/stdc++.h> using namespace std; // to check is subgrid is Magic Square int magicSquare(int a, int b, int c, int d, int e, int f, int g, int h, int i){ int flag=1; // to mark all numbers are unique and between 1 to 9 int arr[9]={0}; arr[a-1]++; arr[b-1]++; arr[c-1]++; arr[d-1]++; arr[e-1]++; arr[f-1]++; arr[g-1]++; arr[h-1]++; arr[i-1]++; for(int i=0;i<9;i++) if(arr[i]>1 || arr[i]<1) //every number occurs exactly once{ flag=0; break; } // checking all sums as 15 if (flag==1 && (a + b + c) == 15 && (d + e + f) == 15 && (g + h + i) == 15 && (a + d + g) == 15 &&(b + e + h) == 15 && (c + f + i) == 15 &&(a + e + i) == 15 && (c + e + g) == 15) return 1; return 0; } int countSquares(int G[3][4],int R, int C){ int count = 0; for (int i = 0; i < R - 2; i++) for (int j = 0; j < C - 2; j++) { if (G[i + 1][j + 1] != 5) continue; int ismagic=magicSquare(G[i][j], G[i][j + 1], G[i][j + 2], G[i + 1][j], G[i + 1][j + 1], G[i + 1][j + 2], G[i + 2][j], G[i + 2][j + 1], G[i + 2][j + 2]); // check for magic square subgrid if (ismagic==1) count++; } return count; } int main(){ int Grid[3][4] = { { 4, 3, 8, 4 },{ 9, 5, 1, 9 },{ 2, 7, 6, 2 } }; int row=3; int col=4; cout <<"Count of Magic Squares in Grid: "<<countSquares(Grid,row,col); return 0; }
出力
Count of Magic Squares in Grid: 1
-
C++の平面内の平行四辺形の数
平行四辺形を形成する点を含む平面が与えられます。タスクは、与えられた点を使用して形成できる平行四辺形の数を計算することです。平行四辺形では、四辺形の反対側は平行であるため、反対の角度は等しくなります。 入力 − int a[] = {0, 2, 5, 5, 2, 5, 2, 5, 2} Int b[] = {0, 0, 1, 4, 3, 8, 7, 11, 10} 出力 −平面内の平行四辺形の数− 3 説明 −(x、y)点が与えられ、これらの点を使用して、図に示すように3つの平行四辺形のカウントを形成できます。 入力 − a[] = {0, 3, 1, 4, 1, 5} b
-
C++で長方形の正方形の数を数える
=Bとなるように、長さL、幅Bの長方形が与えられます。目標は、サイズLXBの長方形が収容できる正方形の数を見つけることです。 上の図は、サイズ3 X 2の長方形を示しています。2、2X2の正方形、6,1X1の正方形があります。 総正方形=6+ 2=8。 サイズLXBのすべての長方形には、1X1の正方形のL*B数があります。 最大の正方形のサイズはBXBです。 L =B =1の場合、正方形=1。 L =B =2の場合、正方形=1 + 4 =5(2X2の1、1X1の4) L =B =3の場合、正方形=1 + 4 + 9 =14(3X3の1、2X2の4、1