在C ++中计算网格中的魔术方块

我们得到一个数字矩阵。目的是找到给定矩阵内存在的幻方数。

魔术正方形(如果作为矩阵使用)是一个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

说明-制作矩阵形式以理解-

1230
4561
7890

所有元素都在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

说明-制作矩阵形式以理解-

1684
8160
3571
4920

所有数字都是唯一的,范围为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