“幻方”是数学上一个有趣的问题,它让一组不同的数字构成一个方阵,并且每行、每列、每个对角线的所有数之和相等。比如最简单的三阶幻方,就是把1~9的数字填到九宫格里,要求横看、竖看、斜着看和都是15。
口诀:二四为肩,六八为足,左三右七,戴九履一,五居中央。
我们可以给定一个n×n的矩阵,也就是二维数组,然后判断它是否是一个幻方:
#include<iostream>
using namespace std;
int main()
{
const int n = 3;
int arr[n][n] = {
{4, 9, 2},
{3, 5, 7},
{8, 1, 6}
};
// 目标和
int target = (1 + n * n) * n / 2;
bool isMagic = true;
// 检验每一行
for (int i = 0; i < n; i++)
{
int sum = 0;
for (int j = 0; j < n; j++)
{
sum += arr[i][j];
}
// 如果和不是target,说明不是幻方
if (sum != target)
{
isMagic = false;
break;
}
}
// 检验每一列
for (int j = 0; j < n; j++)
{
int sum = 0;
for (int i = 0; i < n; i++)
{
sum += arr[i][j];
}
if (sum != target)
{
isMagic = false;
break;
}
}
// 检验两个对角线
int sumDiag1 = 0;
int sumDiag2 = 0;
for (int i = 0; i < n; i++)
{
sumDiag1 += arr[i][i];
sumDiag2 += arr[i][n-i-1];
}
if (sumDiag1 != target || sumDiag2 != target)
{
isMagic = false;
}
// 判断结果
cout << "给定的矩阵arr" << (isMagic ? "是" : "不是") << n << "阶幻方!" << endl;
验证结果: