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); }