手机
当前位置:查字典教程网 >编程开发 >Javascript教程 >JavaScript实现三阶幻方算法谜题解答
JavaScript实现三阶幻方算法谜题解答
摘要:谜题三阶幻方。试将1~9这9个不同整数填入一个3×3的表格,使得每行、每列以及每条对角线上的数字之和相同。策略穷举搜索。列出所有的整数填充方...

谜题

三阶幻方。试将1~9这9个不同整数填入一个3×3的表格,使得每行、每列以及每条对角线上的数字之和相同。

策略

穷举搜索。列出所有的整数填充方案,然后进行过滤。

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时,获取所有填充方案这一穷举操作的耗时将变得极其巨大。

【JavaScript实现三阶幻方算法谜题解答】相关文章:

javascript模拟评分控件实现方法

JavaScript中this关键字使用方法详解

javascript实现设置、获取和删除Cookie的方法

JavaScript基于setTimeout实现计数的方法

简述JavaScript中正则表达式的使用方法

讲解JavaScript中for...in语句的使用方法

JavaScript中的fontsize()方法使用介绍

JavaScript数据结构与算法之链表

JavaScript获得url查询参数的方法

在JavaScript中处理字符串之link()方法的使用

精品推荐
分类导航