Ver pdf

Anuncio
Algoritmo Genérico de Backtracking
- esquema para una solución:
procedimiento ensayar (paso : TipoPaso)
repetir
| seleccionar_candidato
| if aceptable then
| begin
|
anotar_candidato
|
if solucion_incompleta then
|
begin
|
ensayar(paso_siguiente)
|
if no acertado then borrar_candidato
|
end
|
else begin
|
anotar_solucion
|
acertado <- cierto;
| end
hasta que (acertado = cierto) o (candidatos_agotados)
fin procedimiento
- esquema para todas las soluciones:
procedimiento ensayar (paso : TipoPaso)
para cada candidato hacer
| seleccionar candidato
| if aceptable then
| begin
|
anotar_candidato
|
if solucion_incompleta then
|
ensayar(paso_siguiente)
|
else
|
almacenar_solucion
|
borrar_candidato
| end
hasta que candidatos_agotados
fin procedimiento
3-1
5+1
4-2
4+2
3+3
2+4
1+5
5-3
6-4
7-5
8-6
Const n = 8
Tipo
Array de entero [1..n] : Lista Reinas
Var
Lista Reinas : Reinas
Entero : i
Lógico : solución
Inicio
//inicializar el array
desde i <- 1 hasta n hacer
reinas[i] <- 0
fin_desde
Ensayar (reinas, 1, solución)
Si no solución entonces
Escribir (‘no hay solución)
Si no
//presentar solución
fin_si
fin
#include<stdio.h>
enumbool {FALSE, TRUE};
typedefenumboolboolean;
voidensayar(inti, boolean *q, int col[],
booleanfila[], booleandiagb[], booleandiagc[]);
int main(void)
{
inti;
boolean q;
int col[8];
booleanfila[8],diagb[15], diagc[15];
for (i = 0; i< 8; i++) fila[i] = TRUE;
for (i = 0; i< 15; i++) diagb[i] = diagc[i] =
TRUE;
ensayar(0,&q,col,fila,diagb,diagc);
if (q) {
printf("\nSolucion:");
for (i = 0; i< 8; i++) printf(" %d", col[i]);
} elseprintf("\nNo hay solucion");
return 0;
}
voidensayar(inti, boolean *q, int col[],
booleanfila[], booleandiagb[], booleandiagc[])
{
int j;
j = 0;
*q = FALSE;
do {
if (fila[j] &&diagb[i+j] &&diagc[7+i-j]) {
col[i] = j; fila[j] = diagb[i+j] = diagc[7+i-j] =
FALSE;
if (i < 7) { /* encuentra solucion? */
ensayar(i+1,q,col,fila,diagb,diagc);
if (!*q)
fila[j] = diagb[i+j] = diagc[7+i-j] = TRUE;
} else *q = TRUE; /* encuentra la solucion */
}
j++;
} while (!*q && j < 8);
}
Descargar