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)文章
微信公眾號(hào)平臺(tái)接口開發(fā) 獲取access_token過程解析
這篇文章主要介紹了微信公眾號(hào)平臺(tái)接口開發(fā) 獲取access_token過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
uniapp自定義驗(yàn)證碼輸入框并隱藏光標(biāo)
這篇文章主要介紹了uniapp自定義驗(yàn)證碼輸入框隱藏光標(biāo),效果是點(diǎn)擊輸入框喚起鍵盤,藍(lán)框就相當(dāng)于input的光標(biāo),驗(yàn)證碼輸入錯(cuò)誤或者不符合格式要求會(huì)將字體以及邊框改成紅色提示持續(xù)1s然后清空數(shù)據(jù),恢復(fù)原邊框樣式,需要的朋友可以參考下2023-02-02
JavaScript基于自定義函數(shù)判斷變量類型的實(shí)現(xiàn)方法
這篇文章主要介紹了JavaScript基于自定義函數(shù)判斷變量類型的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了javascript判斷變量類型的自定義函數(shù)定義與使用方法,并針對(duì)不同瀏覽器給出了相關(guān)的分析與說明,需要的朋友可以參考下2016-11-11
對(duì) lightbox JS 圖片控件進(jìn)行了一下改造, 使其他支持復(fù)雜的圖片說明
如果要為圖片添加詳細(xì)的圖片說明,并為圖片的說明設(shè)置一些格式,如字體的大小、顏色等,那么使用 title 這個(gè)屬性來設(shè)置這些說明信息是沒辦法實(shí)現(xiàn)的。2010-03-03
JavaScript中Object和Function的關(guān)系小結(jié)
JavaScript 中 Object 和 Function 的關(guān)系是微妙的,他們互為對(duì)方的一個(gè)實(shí)例。2009-09-09
Js使用WScript.Shell對(duì)象執(zhí)行.bat文件和cmd命令
這篇文章主要介紹了Js使用WScript.Shell對(duì)象執(zhí)行.bat文件和cmd命令,需要的朋友可以參考下2014-12-12
ES6中Set和Map數(shù)據(jù)結(jié)構(gòu),Map與其它數(shù)據(jù)結(jié)構(gòu)互相轉(zhuǎn)換操作實(shí)例詳解
這篇文章主要介紹了ES6中Set和Map數(shù)據(jù)結(jié)構(gòu),Map與其它數(shù)據(jù)結(jié)構(gòu)互相轉(zhuǎn)換操作,結(jié)合實(shí)例形式詳細(xì)分析了ES6中的Set和Map數(shù)據(jù)結(jié)構(gòu)的概念、原理、遍歷、去重等操作,以及Map與其它數(shù)據(jù)結(jié)構(gòu)互相轉(zhuǎn)換操作,需要的朋友可以參考下2019-02-02
JavaScript中函數(shù)聲明與函數(shù)表達(dá)式的區(qū)別詳解
可能很多朋友只知道兩種聲明方式一個(gè)是函數(shù)聲明一個(gè)是函數(shù)表達(dá)式,具體有什么不同沒能說得很好。事實(shí)上,JavaScript的解析器對(duì)函數(shù)聲明與函數(shù)表達(dá)式并不是一視同仁地對(duì)待的。下面看看這兩者到底有什么不同。2016-08-08

