javascript三阶幻方算法难题
三阶幻方,将9到9的1个整数填充成一个3×3的表,这样每行、每一列和每一对角线上的数之和是相同的。
策略
列出所有整数填充方案,然后过滤它们。
Javascript的解决方案
复制代码代码如下所示:
*由cshao 12 / 28 / 14。
* /
功能getpermutation(ARR){
如果(arr.length = = 1){
{是}返回;
}
var置换{ };
对于(var i = 0;i < arr.length;i++){
无功firstele = ARR {我};
无功arrclone = arr.slice(0);
ArrClone.splice(I,1);
无功childpermutation = getpermutation(arrclone);
对于(var j = 0;J < childpermutation.length;j++){
childpermutation {,} Unshift(firstele);
}
置换= permutation.concat(childpermutation);
}
返回排列;
}
功能validatecandidate(候选人){
var = =候选{ 0 } } +候选{ { 1 } } +候选{ 2 };
对于(var i = 0;i < 3;i + +){
如果(!(sumofline(候选人,我)= =和sumofcolumn(候选人,我)= =总和)){
返回false;
}
}
如果(sumofdianal(候选,真的)= =和sumofdianal(候选,false)= =总和){
返回true;
}
返回false;
}
功能sumofline(候选人线){
返回候选{行* 3 } +候选{行* 3 + 1 } +候选{行* 3 + 2 };
}
功能sumofcolumn(候选人Col){
返回候选{ + } +候选+ { + 3 + }候选+ { + 6 };
}
功能sumofdianal(候选人,isforwardslash){
返回isforwardslash候选{ 2 } { 4 } + +候选人候选人候选人{ 6 }:{ 0 } + +候选人候选人{ 4 } { 8 };
}
VAR排列= getpermutation({ 1,2,3,4,5,6,7,8,9 });
VaR的候选人;
对于(var i = 0;i < permutation.length;i++){
候选者=置换{ };
如果(validatecandidate(候选人)){
打破;
{人}
候选者=空;
}
}
如果(候选){
console.log(候选人);
{人}
console.log(没有有效的发现);
}
结果
复制代码代码如下所示:
{ 2, 7, 6,9, 5, 1,4, 3, 8 }
描绘幻方:
复制代码代码如下所示:
二百七十六
九百五十一
四百三十八
分析
利用这种策略理论可以得到任意n阶幻方,但实际上只有3阶幻方这一特殊解,因为当n>3时得到的所有填充方案都将成为极其巨大的穷举运算。