JavaScript实现三阶幻方算法谜题解答

谜题

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

策略

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

JavaScript解

代码如下:

function getPermutation(arr) { if (arr.length == 1) { return [arr]; }

var permutation = []; for (var i=0; i

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

结果

代码如下:

描绘成幻方即为:

代码如下:

分析

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

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...