【问题描述】九宫图是我国古老的数学问题,也是一种数字艺术,就是把1~9九个数字填到3行3列九个方格中,使其每一横、坚、斜行之和都等于15。
【九宫图历史】
《系辞》云:“河出图,洛出书,圣人则之。”在宋朝之前,洛书的记述只有文字。
九宫图实物最早发现于西汉,1977年中国考古学家在安徽阜阳县双古堆西汉古墓中发现汉文帝七年(前173年)的太乙九宫占盘,乃是中国汉代幻方的实物。东汉《数术记遗》也有记载。
后来陈抟以降认为河图洛书的洛书代表九宫图,为 1…9 这 9 个数,而 3 行、3 列以及两对角线上各自的数之和均为 15。
【问题分析】
1.首先用perms函数产生1-9的全排列矩阵(9!行9列)。
2.用reshape函数把全排列得到的矩阵重构成3x3的矩阵。
3.计算每一个3x3矩阵的行和、列和、主/副对角线和,并判断它们是否相等。
4.若相等,则把结果存在一个张量Result里。
【主程序代码】
%%
clear all;
close all;
%%
num = 9;
Arr = [1:num];
[SumANine,Result] = ALine(Arr);
【ALine函数】
function [SumANine,Result] = ALine(Arr)
m = 1;
n = 1;
y = perms(Arr);
[col row] = size(y);
for l = 1:col
ALine = reshape(y(l,:),[3,3]);
Sumcol = sum(ALine,2);
Sumrow = sum(ALine,1);
Sumdiag = trace(ALine);
SumSdiag = trace(flip(ALine));
SumANine = [Sumcol.' Sumrow Sumdiag SumSdiag];
if length(unique(SumANine)) == 1
Result(:,:,n) = ALine;
n = n + 1;
end
m = m + 1;
end
end
【运行结果】