源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-08-08 16:23 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:JavaScript实现三阶幻方算法谜题解答
[b]谜题[/b] 三阶幻方。试将1~9这9个不同整数填入一个3×3的表格,使得每行、每列以及每条对角线上的数字之和相同。 [b]策略[/b] 穷举搜索。列出所有的整数填充方案,然后进行过滤。 [b]JavaScript解[/b]
[u]复制代码[/u] 代码如下:
/**  * 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'); }
[b]结果[/b]
[u]复制代码[/u] 代码如下:
[ 2, 7, 6, 9, 5, 1, 4, 3, 8 ]
[b]描绘成幻方即为:[/b]
[u]复制代码[/u] 代码如下:
2    7    6 9    5    1 4    3    8
[b]分析[/b] 使用此策略理论上可以获取任意n阶幻方的解,但实际上只能获得3阶幻方这一特定解,因为当n>3时,获取所有填充方案这一穷举操作的耗时将变得极其巨大。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部