謎題
三階幻方。試將1~9這9個不同整數填入一個3×3的表格,使得每行、每列以及每條對角線上的數字總和相同。
策略
窮舉搜尋。列出所有的整數填滿方案,然後進行過濾。
JavaScript解
function getPermutation(arr) {
if (arr.length == 1) {
return [arr];
}
var permutation = [];
for (var i=0; i
var arrClone = arr.slice(0);
arrClone.splice(i, 1);
var childPermutation = getPermutation(arrClone);
for (var j=0; j
}
permutation = permutation.concat(childPermutation);
}
return permutation;
}
function validateCandidate(candidate) {
var sum = candidate[0] candidate[1] candidate[2];
for (var i=0; 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
if (validateCandidate(candidate)) {
break;
} else {
candidate = null;
}
}
if (candidate) {
console.log(candidate);
} else {
console.log('No valid result found');
}
結果
描繪成幻方即為:
分析
使用此策略理論上可以獲得任意n階幻方的解,但實際上只能得到3階幻方這一特定解,因為當n>3時,獲取所有填充方案這一窮舉操作的耗時將變得極為巨大。