JavaScript实现三阶幻方算法谜题解答
作者:bea
谜题 三阶幻方。试将1~9这9个不同整数填入一个3×3的表格,使得每行、每列以及每条对角线上的数字之和相同。 策略 穷举搜索。列出所有的整数填充方案,然后进行过滤。 JavaScript解 代码如下: /** * Created by cshao on 12/28/14. */ function getPermutation(arr) { if (arr.length == 1) { return [arr]; } var permutati
谜题
三阶幻方。试将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时,获取所有填充方案这一穷举操作的耗时将变得极其巨大。
有用 | 无用
三阶幻方。试将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不使用prototype和new实现继承机制
- JavaScript中的console.assert()函数介绍
- jQuery中:eq()选择器用法实例
- 根据配置文件加载js依赖模块
- JavaScript中的console.dir()函数介绍
- JavaScript中的console.group()函数详细介绍
- 小米公司JavaScript面试题
- 谷歌浏览器调试JavaScript小技巧
- JavaScript中的console.trace()函数介绍
- JavaScript中的console.profile()函数详细介绍
- jQuery中element选择器用法实例
- JavaScript中的console.time()函数详细介绍
- JavaScript前端图片加载管理器imagepool使用详解
- JavaScript版的TwoQueues缓存模型
- 浅谈重写window对象的方法
- JavaScript中的console.log()函数详细介绍
- 深入分析原生JavaScript事件
- JavaScript中的alert()函数使用技巧详解