JavaScript实现三阶幻方算法:穷举搜索与代码解析

作者:拾光

时间:2026-10-29

浏览:392

本文介绍使用JavaScript通过穷举搜索解决三阶幻方问题的方法。核心思路是生成1到9的全排列,逐一验证每行、每列及对角线之和是否相等。代码包含全排列生成、行列对角线求和校验逻辑,并输出唯一解[2,7,6,9,5,1,4,3,8]。

文章目录

三阶幻方谜题与策略

谜题

三阶幻方。尝试把1到9这九个不同的整数填入3×3的表格中,确保每一行、每一列以及两条对角线上的数字总和相等。

策略

穷举搜索。遍历所有可能的整数填充组合,随后进行筛选。

JavaScript穷举搜索实现

JavaScript解

代码如下:

/**
* Created by cshao on 12/28/14.
 */
function getPermutation(arr) {
 if (arr.length == 1) {
 return [arr];
 }
var permutation = [];
 for (var i=0; i<arr.length; i++) {
 var firstEle = arr[i];
 var arrClone = arr.slice(0);
 arrClone.splice(i, 1);
 var childPermutation = getPermutation(arrClone);
 for (var j=0; j<childPermutation.length; j++) {
 childPermutation[j].unshift(firstEle);
 }
 permutation = permutation.concat(childPermutation);
 }
 return permutation;
}
function validateCandidate(candidate) {
 var sum = candidate[0] + candidate[1] + candidate[2];
 for (var i=0; i<3; i++) {
 if (!(sumOfLine(candidate,i)==sum && sumOfColumn(candidate,i)==sum)) {
 return false;
 }
 }
 if (sumOfDiagonal(candidate,true)==sum && sumOfDiagonal(candidate,false)==sum) {
 return true;
 }
 return false;
}
function sumOfLine(candidate, line) {
 return candidate[line*3] + candidate[line*3+1] + candidate[line*3+2];
}
function sumOfColumn(candidate, col) {
 return candidate[col] + candidate[col+3] + candidate[col+6];
}
function sumOfDiagonal(candidate, isForwardSlash) {
 return isForwardSlash ? candidate[2]+candidate[4]+candidate[6] : candidate[0]+candidate[4]+candidate[8];
}
var permutation = getPermutation([1,2,3,4,5,6,7,8,9]);
var candidate;
for (var i=0; i<permutation.length; i++) {
 candidate = permutation[i];
 if (validateCandidate(candidate)) {
 break;
 } else {
 candidate = null;
 }
}
if (candidate) {
 console.log(candidate);
} else {
 console.log('No valid result found');
}

运行结果与方案展示

结果


代码如下:

[ 2, 7, 6, 9, 5, 1, 4, 3, 8 ]

描绘成幻方即为:


代码如下:

2 7 6
9 5 1
4 3 8

算法复杂度分析

分析

使用此策略理论上可以获取任意n阶幻方的解,但实际上只能获得3阶幻方这一特定解,因为当n>3时,获取所有填充方案这一穷举操作的耗时将变得极其巨大。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章