Rompecabezas
Plaza mágica de tercer nivel. Intente completar 9 enteros diferentes, 1 ~ 9, en una tabla 3 × 3, de modo que la suma de los números en cada fila, cada columna y cada diagonal sea la misma.
Estrategia
Búsqueda agotada. Enumere todos los esquemas de relleno entero y filtro.
Solución JavaScript
La copia del código es la siguiente:
/**
* Creado por Chao el 28/12/14.
*/
función getPermutation (arr) {
if (arr.length == 1) {
regresar [arr];
}
var permutación = [];
para (var i = 0; i <arr.length; i ++) {
var firstele = arr [i];
var arrclone = arr.slice (0);
arrclone.splice (i, 1);
var infantilpermutación = getPermutation (arrclone);
para (var j = 0; j <childPermutation.length; j ++) {
Permutación infantil [J] .unshift (Firstele);
}
Permutación = Permutación.concat (Permutación infantil);
}
Permutación de devolución;
}
función validateCandidate (candidato) {
var sum = candidato [0] + candidato [1] + candidato [2];
para (var i = 0; i <3; i ++) {
if (! (SumOfline (candidato, i) == Sum && SumOfColumn (candidato, i) == suma)) {
devolver falso;
}
}
if (SUMOFDIAGONAL (candidato, true) == Sum && SumOfDiaGonal (candidato, falso) == suma) {
devolver verdadero;
}
devolver falso;
}
function sumofline (candidato, línea) {
return candidato [línea*3] + candidato [línea*3 + 1] + candidato [línea*3 + 2];
}
función sumofcolumn (candidato, col) {
Candidato de retorno [col] + candidato [col + 3] + candidato [col + 6];
}
función sumofdiagonal (candidato, isforwardslash) {
¿Devolver IsforwardsLash? candidato [2]+candidato [4]+candidato [6]: candidato [0]+candidato [4]+candidato [8];
}
Var Permutación = GetPermutation ([1,2,3,4,5,6,7,8,9]);
candidato var;
para (var i = 0; i <permutation.length; i ++) {
candidato = permutación [i];
if (validateCandidate (candidato)) {
romper;
} demás {
candidato = nulo;
}
}
if (candidato) {
console.log (candidato);
} demás {
console.log ('No se encontró el resultado válido');
}
resultado
La copia del código es la siguiente:
[2, 7, 6, 9, 5, 1, 4, 3, 8]
Representarlo como un cuadrado mágico es:
La copia del código es la siguiente:
2 7 6
9 5 1
4 3 8
analizar
Usando esta estrategia, teóricamente puede obtener las soluciones de cualquier cuadrado mágico de orden N, pero de hecho, solo puede obtener la solución específica del cuadrado mágico de tercer orden, porque cuando N> 3, la operación que requiere mucho tiempo de obtener todos los esquemas de relleno se volverá extremadamente enorme.