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 16 Javascript
jquery.zclip轻量级复制失效问题
Jan 08 Javascript
基于jQuery实现简单人工智能聊天室
Feb 10 Javascript
vue2.0使用Sortable.js实现的拖拽功能示例
Feb 21 Javascript
vue仿element实现分页器效果
Sep 13 Javascript
layui table设置某一行的字体颜色方法
Sep 05 Javascript
js判断密码强度的方法
Mar 18 Javascript
JS实现滑动拼图验证功能完整示例
Mar 29 Javascript
react基本安装与测试示例
Apr 27 Javascript
JavaScript如何使用插值实现图像渐变
Jun 28 Javascript
vue添加锚点,实现滚动页面时锚点添加相应的class操作
Aug 10 Javascript
详解JavaScript中分解数字的三种方法
Jan 05 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
PHP递归返回值时出现的问题解决办法
2013/02/19 PHP
php curl模拟post提交数据示例
2013/12/31 PHP
ThinkPHP模版引擎之变量输出详解
2014/12/05 PHP
discuz目录文件资料汇总
2014/12/30 PHP
jQuery+PHP实现的掷色子抽奖游戏实例
2015/01/04 PHP
php生成年月日下载列表的方法
2015/04/24 PHP
PHP使用Pthread实现的多线程操作实例
2015/11/14 PHP
[原创]php简单防盗链验证实现方法
2016/07/09 PHP
ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
2019/04/03 PHP
JQuery的ready函数与JS的onload的区别详解
2013/11/21 Javascript
很全面的JavaScript常用功能汇总集合
2016/01/22 Javascript
JavaScript从数组的indexOf()深入之Object的Property机制
2016/05/11 Javascript
仅9张思维导图帮你轻松学习Javascript 就这么简单
2016/06/01 Javascript
AngularJS在IE下取数据总是缓存问题的解决方法
2016/08/05 Javascript
node.js实现快速截图
2016/08/27 Javascript
vuex 项目结构目录及一些简单配置介绍
2018/04/08 Javascript
layer.close()关闭进度条和Iframe窗的方法
2018/08/17 Javascript
详解如何配置vue-cli3.0的vue.config.js
2018/08/23 Javascript
JavaScript实现简单音乐播放器
2020/04/17 Javascript
javascript canvas API内容整理
2020/02/16 Javascript
Python while 循环使用的简单实例
2016/06/08 Python
开源软件包和环境管理系统Anaconda的安装使用
2017/09/04 Python
Python实现简单的文本相似度分析操作详解
2018/06/16 Python
python实现简单的单变量线性回归方法
2018/11/08 Python
django解决跨域请求的问题
2018/11/11 Python
Django实现分页显示效果
2019/10/31 Python
实例教程 一款纯css3实现的数字统计游戏
2014/11/10 HTML / CSS
员工生日会策划方案
2014/06/14 职场文书
“四风”问题对照检查材料思想汇报
2014/09/16 职场文书
个人四风问题对照检查材料
2014/10/01 职场文书
学校政风行风评议工作总结
2014/10/21 职场文书
活动总结模板大全
2015/05/11 职场文书
任命书格式模板
2015/09/22 职场文书
2016年“5.12”护士节慰问信
2015/11/30 职场文书
聊聊golang中多个defer的执行顺序
2021/05/08 Golang
详解MongoDB的条件查询和排序
2021/06/23 MongoDB