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 相关文章推荐
jQuery 动态酷效果实现总结
Dec 27 Javascript
extjs grid设置某列背景颜色和字体颜色的方法
Sep 03 Javascript
JS保留两位小数,多位小数的示例代码
Jan 07 Javascript
setTimeout自动触发一个js的方法
Jan 15 Javascript
JavaScript插件化开发教程(六)
Feb 01 Javascript
JavaScript中的small()方法使用详解
Jun 08 Javascript
node学习记录之搭建web服务器教程
Feb 16 Javascript
利用vue.js插入dom节点的方法
Mar 15 Javascript
详解vue-router 2.0 常用基础知识点之router.push()
May 10 Javascript
详解JavaScript中typeof与instanceof用法
Oct 24 Javascript
使用vue2实现带地区编号和名称的省市县三级联动效果
Nov 05 Javascript
vue的三种图片引入方式代码实例
Nov 19 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的类 功能齐全的发送邮件类
2006/10/09 PHP
用PHP提取中英文词语以及数字的首字母的方法介绍
2013/04/23 PHP
php二维数组用键名分组相加实例函数
2013/11/06 PHP
php+ajax实时输入自动搜索匹配的方法
2014/12/26 PHP
PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例
2020/08/17 PHP
PHP实现二维数组中的查找算法小结
2018/06/09 PHP
PHP设计模式之简单工厂和工厂模式实例分析
2019/03/25 PHP
jquery 简单图片导航插件jquery.imgNav.js
2010/03/17 Javascript
给Flash加一个超链接(推荐使用透明层)兼容主流浏览器
2013/06/09 Javascript
复选框全选与全不选操作实现思路
2013/08/18 Javascript
Jquery 改变radio/checkbox选中状态,获取选中的值(示例代码)
2013/12/12 Javascript
一段非常简单的js判断浏览器的内核
2014/08/17 Javascript
jquery实现文本框textarea自适应高度
2016/03/09 Javascript
设计模式中的facade外观模式在JavaScript开发中的运用
2016/05/18 Javascript
JS获取屏幕高度的简单实现代码
2016/05/24 Javascript
Angular 4.x+Ionic3踩坑之Ionic 3.x界面传值详解
2018/03/13 Javascript
Vue代码整洁之去重方法整理
2019/08/06 Javascript
vue学习笔记之slot插槽基本用法实例分析
2020/02/01 Javascript
Vue3不支持Filters过滤器的问题
2020/09/24 Javascript
JavaScript字符串转数字的简单实现方法
2020/11/27 Javascript
[47:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第二场 3月4日
2021/03/11 DOTA
一个基于flask的web应用诞生 bootstrap框架美化(3)
2017/04/11 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
2018/04/08 Python
python提取图像的名字*.jpg到txt文本的方法
2018/05/10 Python
对pyqt5之menu和action的使用详解
2019/06/20 Python
Keras官方中文文档:性能评估Metrices详解
2020/06/15 Python
手把手教你用Django执行原生SQL的方法
2021/02/18 Python
HTML5 HTMLCollection和NodeList的区别详解
2020/04/29 HTML / CSS
HTML5 FileReader对象的具体使用方法
2020/05/22 HTML / CSS
舞会礼服和舞会鞋:PromGirl
2019/04/22 全球购物
美国战术品牌:5.11 Tactical
2019/05/01 全球购物
运输服务质量承诺书
2014/03/27 职场文书
股份转让协议书
2014/04/12 职场文书
个人授权委托书格式
2014/08/30 职场文书
停电调休通知
2015/04/16 职场文书
科技活动总结范文
2015/05/11 职场文书