在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
说明-制作矩阵形式以理解-
所有元素都在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到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(inta,intb…..inti)将所有9个元素作为输入,并检查是否使魔术平方。如果是幻方,则返回1,否则返回1。
在这里,我们将使用数组arr[9]存储所有参数,并通过检查它们是否在其中占据唯一的单元格来检查它们是否唯一。如果单元格的计数<1表示否。不在1到9的范围内,或者如果count>1则为no。不是唯一的。设置标志=0
如果flag为1,那么我们将检查行,列,对角线总和为15。如果为true,则它是一个幻方。返回1,否则返回0。
函数countSquares(intG[3][4],intR,intC)将一个网格,其行和列作为输入并计算no。存在的魔方。
计数用于存储此类平方数的计数。
从第一个元素开始遍历,直到第2行,col-2(3X3矩阵)
如果对角线G[i+1][j+1]的中间不是5,那么魔术平方是不可能的,请跳过当前迭代。
否则,将其传递给magicSquare(intatoi)检查所有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是MagicSquare- 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