JavaScript實(shí)現(xiàn)三階幻方算法謎題解答
謎題
三階幻方。試將1~9這9個(gè)不同整數(shù)填入一個(gè)3×3的表格,使得每行、每列以及每條對(duì)角線上的數(shù)字之和相同。
策略
窮舉搜索。列出所有的整數(shù)填充方案,然后進(jìn)行過濾。
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');
}
結(jié)果
[ 2, 7, 6, 9, 5, 1, 4, 3, 8 ]
描繪成幻方即為:
2 7 6
9 5 1
4 3 8
分析
使用此策略理論上可以獲取任意n階幻方的解,但實(shí)際上只能獲得3階幻方這一特定解,因?yàn)楫?dāng)n>3時(shí),獲取所有填充方案這一窮舉操作的耗時(shí)將變得極其巨大。
相關(guān)文章
javascript Range對(duì)象跨瀏覽器常用操作
最近在開發(fā)在線代碼編輯器的過程中頻繁接觸Range對(duì)象,由于跨瀏覽器的需求,使用到ie下TextRange對(duì)象和標(biāo)準(zhǔn)Dom Range對(duì)象。2009-10-10JS實(shí)現(xiàn)表單驗(yàn)證功能(驗(yàn)證手機(jī)號(hào)是否存在,驗(yàn)證碼倒計(jì)時(shí))
js實(shí)現(xiàn)表單驗(yàn)證功能,通過js代碼驗(yàn)證手機(jī)號(hào)是否存在驗(yàn)證碼倒計(jì)時(shí)功能,代碼簡(jiǎn)單易懂非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧2016-10-10理解Javascript_09_Function與Object
在《理解Javascript_08_函數(shù)對(duì)象》中講解了很多函數(shù)對(duì)象的問題,同時(shí)也留下了許多疑問,今天讓我們來解答部分問題。2010-10-10微信小程序中獲取用戶手機(jī)號(hào)授權(quán)登錄詳細(xì)步驟
這篇文章主要給大家介紹了關(guān)于微信小程序中獲取用戶手機(jī)號(hào)授權(quán)登錄的詳細(xì)步驟,在微信小程序中開發(fā)者可以通過微信提供的API接口實(shí)現(xiàn)用戶登錄和獲取用戶的手機(jī)號(hào),需要的朋友可以參考下2023-07-07淺析JavaScript回調(diào)函數(shù)應(yīng)用
這篇文章主要為大家詳細(xì)介紹了JavaScript回調(diào)函數(shù)應(yīng)用,感興趣的朋友可以參考一下2016-05-05基于JavaScript實(shí)現(xiàn)鼠標(biāo)箭頭移動(dòng)圖片跟著移動(dòng)
這篇文章主要介紹了基于JavaScript實(shí)現(xiàn)鼠標(biāo)箭頭移動(dòng)圖片跟著移動(dòng)的核心代碼,代碼比較簡(jiǎn)單易懂,需要的朋友可以參考下2016-08-08