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 相关文章推荐
JavaScript获取文本框内选中文本的方法
Feb 20 Javascript
使用AngularJS编写较为优美的JavaScript代码指南
Jun 19 Javascript
基于jquery实现人物头像跟随鼠标转动
Aug 23 Javascript
JavaScript Split()方法
Dec 18 Javascript
JS简单测试循环运行时间的方法
Sep 04 Javascript
一个极为简单的requirejs实现方法
Oct 20 Javascript
js+css3实现旋转效果
Jan 20 Javascript
详解微信小程序设置底部导航栏目方法
Jun 29 Javascript
vue实现自定义多选与单选的答题功能
Jul 05 Javascript
详解适配器在JavaScript中的体现
Sep 28 Javascript
React 源码中的依赖注入方法
Nov 07 Javascript
js核心基础之构造函数constructor用法实例分析
May 11 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 checkbox复选框值的获取与checkbox默认值输出方法
2010/05/15 PHP
php中经典方法实现判断多维数组是否为空
2011/10/23 PHP
PHP删除数组中空值的方法介绍
2014/04/14 PHP
PHP的fsockopen、pfsockopen函数被主机商禁用的解决办法
2014/07/08 PHP
phpmyadmin中禁止外网使用的方法
2014/11/04 PHP
Smarty分页实现方法完整实例
2016/05/11 PHP
php 中self,this的区别和操作方法实例分析
2019/11/04 PHP
jQuery实现单行文字间歇向上滚动源代码
2013/06/02 Javascript
JS 退出系统并跳转到登录界面的实现代码
2013/06/29 Javascript
Jquery取得iframe下内容的方法
2013/11/18 Javascript
js实现正方形颜色从下往上升的效果
2014/08/04 Javascript
js对象基础实例分析
2015/01/13 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形菜单
2015/11/30 Javascript
JavaScript的React框架中的JSX语法学习入门教程
2016/03/05 Javascript
jQuery表单事件实例代码分享
2016/08/18 Javascript
原生js实现验证码功能
2017/03/16 Javascript
js实现字符全排列算法的简单方法
2017/05/01 Javascript
微信JSAPI Ticket接口签名详解
2020/06/28 Javascript
从零开始用electron手撸一个截屏工具的示例代码
2018/10/10 Javascript
手把手教你使用TypeScript开发Node.js应用
2019/05/06 Javascript
JavaScript 中的无穷数(Infinity)详解
2020/02/13 Javascript
详解python while 函数及while和for的区别
2018/09/07 Python
对python3 Serial 串口助手的接收读取数据方法详解
2019/06/12 Python
Python requests模块基础使用方法实例及高级应用(自动登陆,抓取网页源码)实例详解
2020/02/14 Python
基于python实现对文件进行切分行
2020/04/26 Python
tensorflow之读取jpg图像长和宽实例
2020/06/18 Python
详解Python多线程下的list
2020/07/03 Python
区分python中的进程与线程
2020/08/13 Python
AmazeUI中模态框的实现
2020/08/19 HTML / CSS
澳大利亚厨房和家用电器购物网站:Bing Lee
2021/01/11 全球购物
期中考试后的反思
2014/02/08 职场文书
总账会计岗位职责
2014/03/13 职场文书
法人授权委托书公证范本
2014/09/14 职场文书
体育运动会广播稿
2014/10/05 职场文书
材料员岗位职责范本
2015/04/11 职场文书
css3中2D转换之有趣的transform形变效果
2022/02/24 HTML / CSS