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 实现无干扰阴影效果 简单好用(附文件下载)
Dec 27 Javascript
jquery1.4.2 for Visual studio 2010 模板文件
Jul 14 Javascript
jQuery实现鼠标经过图片预览大图效果
Apr 10 Javascript
jQuery获取多种input值的简单实现方法
Jun 20 Javascript
window.open打开窗口被拦截的快速解决方法
Aug 04 Javascript
Canvas 绘制粒子动画背景
Feb 15 Javascript
Bootstrap4如何定制自己的颜色和风格
Feb 26 Javascript
小程序如何在不同设备上自适应生成海报的实现方法
Aug 20 Javascript
利用JS响应式修改vue实现页面的input值
Sep 02 Javascript
在Vue mounted方法中使用data变量详解
Nov 05 Javascript
微信小程序顶部导航栏可滑动并选中放大
Dec 05 Javascript
vue实现几秒后跳转新页面代码
Sep 09 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
Thinkphp5.0自动生成模块及目录的方法详解
2017/04/17 PHP
PHP实现的服务器一致性hash分布算法示例
2018/08/09 PHP
Laravel框架文件上传功能实现方法示例
2019/04/16 PHP
for 循环性能比较 提高for循环的效率
2009/03/19 Javascript
jquery的键盘事件修改代码
2011/02/24 Javascript
初识JQuery 实例一(first)
2011/03/16 Javascript
jQuery UI Autocomplete 1.8.16 中文输入修正代码
2012/04/16 Javascript
web的各种前端打印方法之jquery打印插件PrintArea实现网页打印
2013/01/09 Javascript
屏蔽相应键盘按钮操作
2014/03/10 Javascript
javascript生成img标签的3种实现方法(对象、方法、html)
2015/12/25 Javascript
Jquery实现简单的轮播效果(代码管用)
2016/03/14 Javascript
JS使用cookie设置样式的方法
2016/06/30 Javascript
第一次接触神奇的Bootstrap表单
2016/07/27 Javascript
Bootstrap源码解读网格系统(3)
2016/12/22 Javascript
jQuery实现联动下拉列表查询框
2017/01/04 Javascript
javascript添加前置0(补零)的几种方法
2017/01/05 Javascript
jQuery实现的点击标题文字切换字体效果示例【测试可用】
2018/04/26 jQuery
vue微信分享的实现(在当前页面分享其他页面)
2019/04/16 Javascript
使用Vue 自定义文件选择器组件的实例代码
2020/03/04 Javascript
解决ant design vue中树形控件defaultExpandAll设置无效的问题
2020/10/26 Javascript
[04:51]TI10典藏宝瓶Ⅱ外观视频展示
2020/08/15 DOTA
python flask实现分页效果
2017/06/27 Python
python爬虫实战之最简单的网页爬虫教程
2017/08/13 Python
Python实现句子翻译功能
2017/11/14 Python
python 实现判断ip连通性的方法总结
2018/04/22 Python
Python中的枚举类型示例介绍
2019/01/09 Python
CSS3的常见transformation图形变化用法小结
2016/05/13 HTML / CSS
纯HTML5+CSS3制作生日蛋糕(代码易懂)
2016/11/16 HTML / CSS
HTML5实现直播间评论滚动效果的代码
2020/05/27 HTML / CSS
Desigual德国官网:在线购买原创服装
2018/03/27 全球购物
改变生活的男士内衣:SAXX Underwear
2019/08/28 全球购物
西北政法大学自主招生自荐信
2014/01/29 职场文书
导航工程专业自荐信
2014/09/02 职场文书
新郎婚礼答谢词
2015/01/04 职场文书
公司市场部岗位职责
2015/04/15 职场文书
2015-2016年小学教导工作总结
2015/07/21 职场文书