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 25 Javascript
jquery遍历input取得input的name
Apr 27 Javascript
jquery getScript动态加载JS方法改进详解
Nov 15 Javascript
jQuery中empty()方法用法实例
Jan 16 Javascript
Nginx上传文件全部缓存解决方案
Aug 17 Javascript
jquery特效 点击展示与隐藏全文
Dec 09 Javascript
js实现纯前端的图片预览
Apr 27 Javascript
微信小程序 wx.request(OBJECT)发起请求详解
Oct 13 Javascript
js获取浏览器高度 窗口高度 元素尺寸 偏移属性的方法
Nov 21 Javascript
微信小程序 天气预报开发实例代码源码
Jan 20 Javascript
基于ionic实现下拉刷新功能
May 10 Javascript
快速对接payjq的个人微信支付接口过程解析
Aug 15 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/06/17 PHP
PHP实现chrome表单请求数据转换为接口使用的json数据
2021/03/04 PHP
简单的前端js+ajax 购物车框架(入门篇)
2011/10/29 Javascript
window.location.href中url中数据量太大时的解决方法
2013/12/23 Javascript
JS获取文本框,下拉框,单选框的值的简单实例
2014/02/26 Javascript
JavaScript获得url查询参数的方法
2015/07/02 Javascript
JavaScript和HTML DOM的区别与联系及Javascript和DOM的关系
2015/11/15 Javascript
javascript精确统计网站访问量实例代码
2015/12/19 Javascript
canvas绘制表盘时钟
2017/01/23 Javascript
学习使用Bootstrap输入框、导航、分页等常用组件
2017/05/11 Javascript
纯JS实现可用于页码更换的飞页特效示例
2018/05/21 Javascript
vue中使用微信公众号js-sdk踩坑记录
2019/03/29 Javascript
layui之数据表格--与后台交互获取数据的方法
2019/09/29 Javascript
使用Python开发windows GUI程序入门实例
2014/10/23 Python
深入解析Python编程中JSON模块的使用
2015/10/15 Python
python中利用zfill方法自动给数字前面补0
2018/04/10 Python
python字典一键多值实例代码分享
2019/06/14 Python
python实现五子棋游戏
2019/06/18 Python
django中forms组件的使用与注意
2019/07/08 Python
Python使用QQ邮箱发送邮件报错smtplib.SMTPAuthenticationError
2019/12/20 Python
使用Python实现Wake On Lan远程开机功能
2020/01/22 Python
利用python实现后端写网页(flask框架)
2021/02/28 Python
CSS3中border-radius属性设定圆角的使用技巧
2016/05/10 HTML / CSS
巴西美妆购物网站:Kutiz Beauté
2019/03/13 全球购物
怎样声明一个匿名的内部类
2016/06/01 面试题
法学专业应届生求职信
2013/10/16 职场文书
开办饭店创业计划书
2013/12/28 职场文书
致跳远运动员加油稿
2014/02/11 职场文书
企业管理标语
2014/06/10 职场文书
2014年党员学习“三严三实”思想汇报
2014/09/15 职场文书
房产授权委托书范本
2014/09/22 职场文书
乡镇团代会开幕词
2016/03/04 职场文书
Python一行代码实现自动发邮件功能
2021/05/30 Python
Redis 彻底禁用RDB持久化操作
2021/07/09 Redis
SQL语句中EXISTS的详细用法大全
2022/06/25 MySQL
Win10服务主机占用内存怎么办?Win10服务主机进程占用大量内存解决方法
2022/09/23 数码科技