首頁  >  文章  >  web前端  >  JavaScript實作三階幻方演算法謎題解答_javascript技巧

JavaScript實作三階幻方演算法謎題解答_javascript技巧

WBOY
WBOY原創
2016-05-16 16:23:441957瀏覽

謎題

三階幻方。試將1~9這9個不同整數填入一個3×3的表格,使得每行、每列以及每條對角線上的數字總和相同。

策略

窮舉搜尋。列出所有的整數填滿方案,然後進行過濾。

JavaScript解

複製程式碼 程式碼如下:

/**
 * 由cshao於2014年12月28日創作。
 */

function getPermutation(arr) {
  if (arr.length == 1) {
    return [arr];
  }

  var permutation = [];
  for (var i=0; i     var firstEle = arr[i];
    var arrClone = arr.slice(0);
    arrClone.splice(i, 1);
    var childPermutation = getPermutation(arrClone);
    for (var j=0; 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     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   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時,獲取所有填充方案這一窮舉操作的耗時將變得極為巨大。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn