Quebra-cabeça
Quadrado mágico de terceiro nível. Tente preencher 9 números inteiros diferentes, 1 ~ 9, em uma tabela 3 × 3, de modo que a soma dos números em cada linha, cada coluna e cada diagonal seja a mesma.
Estratégia
Pesquisa exausta. Liste todos os esquemas inteiros de preenchimento e filtre.
Solução JavaScript
A cópia do código é a seguinte:
/**
* Criado por Chao em 28/12/14.
*/
função getPermuation (arr) {
if (arr.Length == 1) {
retornar [arr];
}
var permutation = [];
for (var i = 0; i <arn.length; i ++) {
var FirstEle = arr [i];
var ArrClone = arr.slice (0);
arrclone.splice (i, 1);
VAR ChildperMuation = getPermuation (ARCLONE);
for (var j = 0; j <childpermuation.length; j ++) {
ChildperMuation [J] .Unshift (FirstEle);
}
Permutação = Permutação.Concat (Childpermuation);
}
permutação de retorno;
}
função validateCandidate (candidato) {
var sum = candidato [0] + candidato [1] + candidato [2];
for (var i = 0; i <3; i ++) {
if (! (SUMOFLINE (candidato, i) == sum && sumofcolumn (candidato, i) == sum)) {
retornar falso;
}
}
if (sumofdiagonal (candidato, true) == sum && sumofdiagonal (candidato, false) == sum) {
retornar true;
}
retornar falso;
}
função sumofline (candidato, linha) {
Retorne candidato [linha*3] + candidato [linha*3 + 1] + candidato [linha*3 + 2];
}
função sumofcolumn (candidato, col) {
Retorne candidato [col] + candidato [col + 3] + candidato [col + 6];
}
função sumofdiagonal (candidato, isforwardslash) {
retornar isforwardslash? candidato [2]+candidato [4]+candidato [6]: candidato [0]+candidato [4]+candidato [8];
}
var permutation = getPermuation ([1,2,3,4,5,6,7,8,9]);
candidato var;
for (var i = 0; i <Permutação.Length; i ++) {
candidato = permutação [i];
if (validateCandidate (candidato)) {
quebrar;
} outro {
candidato = nulo;
}
}
if (candidato) {
console.log (candidato);
} outro {
console.log ('nenhum resultado válido encontrado');
}
resultado
A cópia do código é a seguinte:
[2, 7, 6, 9, 5, 1, 4, 3, 8]
Representá -lo como um quadrado mágico é:
A cópia do código é a seguinte:
2 7 6
9 5 1
4 3 8
analisar
Usando essa estratégia, você pode teoricamente obter as soluções de qualquer quadrado mágico de ordem N, mas, na verdade, você pode obter apenas a solução específica do quadrado mágico de terceira ordem, porque quando n> 3, a operação demorada de obter todos os esquemas de preenchimento se tornará extremamente enorme.