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


Posted in Javascript onDecember 29, 2014

谜题

三阶幻方。试将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 相关文章推荐
两种简单实现菜单高亮显示的JS类代码
Jun 27 Javascript
页面只有一个text的时候,回车自动submit的解决方法
Aug 12 Javascript
Textarea与懒惰渲染实现代码
Jan 04 Javascript
基于jQuery的弹出框插件
Mar 18 Javascript
JQuery使用index方法获取Jquery对象数组下标的方法
May 18 Javascript
JavaScript文档碎片操作实例分析
Dec 12 Javascript
js利用正则表达式检验输入内容是否为网址
Jul 05 Javascript
js中常用的Tab切换效果(推荐)
Aug 30 Javascript
jQuery autoComplete插件两种使用方式及动态改变参数值的方法详解
Oct 24 Javascript
jquery之基本选择器practice(实例讲解)
Sep 30 jQuery
js中let和var定义变量的区别
Feb 08 Javascript
vue视频播放暂停代码
Nov 08 Javascript
浅谈JavaScript Date日期和时间对象
Dec 29 #Javascript
jQuery中clearQueue()方法用法实例
Dec 29 #Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
Dec 29 #Javascript
浅谈JavaScript Array对象
Dec 29 #Javascript
JavaScript实现N皇后问题算法谜题解答
Dec 29 #Javascript
jQuery中dequeue()方法用法实例
Dec 29 #Javascript
jQuery中queue()方法用法实例
Dec 29 #Javascript
You might like
解析左右值无限分类的实现算法
2013/06/20 PHP
php+ajax实现图片文件上传功能实例
2014/06/17 PHP
PHP foreach遍历多维数组实现方式
2016/11/16 PHP
PHP对称加密算法(DES/AES)类的实现代码
2017/11/14 PHP
js no-repeat写法 背景不重复
2009/03/18 Javascript
jQuery 图像裁剪插件Jcrop的简单使用
2009/05/22 Javascript
jquery命令汇总,方便使用jquery的朋友
2012/06/26 Javascript
jQuery $.get 的妙用 访问本地文本文件
2012/07/12 Javascript
js实现跨域访问的三种方法
2015/12/09 Javascript
基于vue-cli vue-router搭建底部导航栏移动前端项目
2018/02/28 Javascript
echarts设置图例颜色和地图底色的方法实例
2018/08/01 Javascript
vue使用better-scroll实现下拉刷新、上拉加载
2018/11/23 Javascript
三步实现ionic3点击退出app程序
2019/09/17 Javascript
Vue.js计算机属性computed和methods方法详解
2019/10/12 Javascript
微信小程序利用button控制条件标签的变量问题
2020/03/15 Javascript
[01:48]帕吉至宝加入游戏,遗迹战场现“千劫神屠”
2018/04/07 DOTA
Python开发之快速搭建自动回复微信公众号功能
2016/04/22 Python
如何在Python函数执行前后增加额外的行为
2016/10/20 Python
python anaconda 安装 环境变量 升级 以及特殊库安装的方法
2017/06/21 Python
python 中random模块的常用方法总结
2017/07/08 Python
python监控键盘输入实例代码
2018/02/09 Python
python编写弹球游戏的实现代码
2018/03/12 Python
python单线程文件传输的实例(C/S)
2019/02/13 Python
python用线性回归预测股票价格的实现代码
2019/09/04 Python
python扫描线填充算法详解
2020/02/19 Python
使用 Python 读取电子表格中的数据实例详解
2020/04/17 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
2020/12/14 Python
selenium+超级鹰实现模拟登录12306
2021/01/24 Python
开办化妆品公司创业计划书
2013/12/26 职场文书
项目开发计划书
2014/01/09 职场文书
师德自我剖析材料范文
2014/10/06 职场文书
加强作风建设工作总结
2014/10/23 职场文书
社区党支部承诺书
2015/04/29 职场文书
golang如何去除多余空白字符(含制表符)
2021/04/25 Golang
Win10 heic文件怎么打开 ? Win10 heic文件打开教程
2022/04/06 数码科技
Android中View.post和Handler.post的关系
2022/06/05 Java/Android