我们得到一个数字矩阵。目的是找到给定矩阵内存在的幻方数。
魔术正方形(如果作为矩阵使用)是一个3X3矩阵,其中包含从1到9的元素,就像Sudoku中的网格一样。属性是-
所有数字仅出现一次。
矩阵中所有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 [] []存储数字,行和col存储其尺寸。
函数magicSquare(int a,int b…..int i)将所有9个元素作为输入,并检查是否使魔术平方。如果是幻方,则返回1,否则返回1。
在这里,我们将使用数组arr [9]存储所有参数,并通过检查它们是否在其中占据唯一的单元格来检查它们是否唯一。如果单元格的计数<1表示否。不在1到9的范围内,或者如果count> 1则为no。不是唯一的。设置标志= 0
如果flag为1,那么我们将检查行,列,对角线总和为15。如果为true,则它是一个幻方。返回1,否则返回0。
函数countSquares(int G [3] [4],int R,int C)将一个网格,其行和列作为输入并计算no。存在的魔方。
计数用于存储此类平方数的计数。
从第一个元素开始遍历,直到第2行,col-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; //要检查的是subgrid是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; } //检查所有和为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]); //检查魔术方形子网格 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