퍼즐
3 단계 매직 스퀘어. 9 개의 다른 정수 (1 ~ 9)를 3 × 3 테이블로 채우면 각 행의 숫자, 각 열 및 각 대각선이 동일하도록하십시오.
전략
지친 검색. 모든 정수 채우기 체계 및 필터를 나열하십시오.
자바 스크립트 솔루션
코드 사본은 다음과 같습니다.
/**
* 12/28/14에 Chao에 의해 만들어졌습니다.
*/
함수 getpermutation (arr) {
if (arr.length == 1) {
반환 [arr];
}
var 순열 = [];
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]. Unshift (Firstele);
}
순열 = Pembutat.Concat (가축);
}
리턴 순열;
}
함수 validAteCandidate (후보) {
var sum = 후보 [0] + 후보 [1] + 후보 [2];
for (var i = 0; i <3; i ++) {
if (!
거짓을 반환합니다.
}
}
if (sumofdiagonal (후보자, true) == sum && sumofdiagonal (후보자, false) == 합) {
진실을 반환하십시오.
}
거짓을 반환합니다.
}
함수 sumofline (후보자, 줄) {
반환 후보 [line*3] + 후보 [line*3 + 1] + 후보 [line*3 + 2];
}
함수 sumofcolumn (후보자, col) {
반환 후보 [col] + 후보 [col + 3] + 후보 [col + 6];
}
함수 sumofdiagonal (후보자, isforwardsLash) {
반환 ISFORWARDSLASH? 후보 [2]+후보 [4]+후보 [6] : 후보 [0]+후보 [4]+후보 [8];
}
var 순열 = getpermutation ([1,2,3,4,5,6,7,8,9]);
var 후보;
for (var i = 0; i <emputation.length; i ++) {
후보 = 순열 [i];
if (validateCandidate (후보)) {
부서지다;
} 또 다른 {
후보 = null;
}
}
if (후보) {
Console.log (후보);
} 또 다른 {
Console.log ( '유효한 결과 없음');
}
결과
코드 사본은 다음과 같습니다.
[2, 7, 6, 6, 9, 5, 1, 4, 3, 8]
마법의 광장으로 묘사하는 것은 다음과 같습니다.
코드 사본은 다음과 같습니다.
2 7 6
9 5 1
4 3 8
분석
이 전략을 사용하면 이론적으로 N-Tord Magic Square의 솔루션을 얻을 수 있지만 실제로는 N> 3의 경우 모든 충전 체계를 얻는 시간이 많이 걸리는 작업이 매우 크게되므로 3 차 Magic Square의 특정 솔루션 만 얻을 수 있습니다.