¿Cómo colocar 8 damas o reinas en el tablero de ajedrez, sin que se coman mutuamente?
DECLARE SUB refresh () 'Colocar 8 damas en tablero de ajedrez, de manera que no se coman. ' Este problema lo plante¢ Nicol s en la noche del lunes anterior al '8 de septiembre de 1999. A ‚l se debe tambi‚n el m‚todo de b£squeda 'consistente en probar todas las posiciones posibles para la £ltima 'dama y retroceder si no se puede colocar. ' '1- No puede haber dos damas en la misma fila. '2- No puede haber dos damas en la misma columna. '3- No puede haber dos damas en la misma diagonal. ' 'Lo m s complicado de comprobar es lo £ltimo, pero equivale a: 'comprobar si en (y-x,y) (y-(x-1),y-1)... hay dama. ' Creo que hay que chequear que / x1+y1<>x2+y2. ' \ x1+y1<>x2-y2. ' 12345678 '1ba diagonal(a): {<1,2>,<2,3>,<3,4>...} (x-y=-1) '2cba diagonal(b): {<1,1>,<2,2>,<3,3>...} (x-y=0) '3 cba diagonal(c): {<2,1>,<3,2>,<4,3>...} (x-y=-1) '4 cba '5 cba '6 cba ' ' 12345678 '1 abc diagonal(a): {<2,1>,<1,2>} (x+y=3) '2abc diagonal(b): {<3,1>,<2,2>,<1,3>} (x+y=4) '3bc diagonal(c): {<1,4>,<2,3>,<3,2>...} (x+y=5) '4c '5 '6 ' DIM damas(8) AS INTEGER 'Dama(n) est colocada en (n,dama(n)) CLS FOR f = 0 TO 7 FOR G = 0 TO 7 LOCATE G + 2, f * 2 + 3 IF (G + f) MOD 2 THEN COLOR 0, 7 ELSE COLOR 7, 0 PRINT " "; NEXT NEXT colocandodama = 0 dama(colocandodama) = 0 FOR f = 0 TO 7 LOCATE f + 2, dama(f) * 2 + 3 IF (dama(f) + f) MOD 2 THEN COLOR 0, 7 ELSE COLOR 7, 0 PRINT " " NEXT DO repetir = 0 dama(colocandodama) = dama(colocandodama) + 1 DO WHILE dama(colocandodama) > 7 LOCATE colocandodama + 2, dama(colocandodama) * 2 + 3 IF (dama(colocandodama) + colocandodama) MOD 2 THEN COLOR 0, 7 ELSE COLOR 7, 0 PRINT " " dama(colocandodama) = -1 colocandodama = colocandodama - 1 repetir = -1 LOOP LOCATE colocandodama + 2, dama(colocandodama) * 2 + 3 IF (dama(colocandodama) + colocandodama) MOD 2 THEN COLOR 0, 7 ELSE COLOR 7, 0 PRINT "*" FOR f = 0 TO colocandodama - 1 IF dama(f) = dama(colocandodama) THEN repetir = -1 ELSEIF dama(f) + f = dama(colocandodama) + colocandodama THEN repetir = -1 ELSEIF dama(f) - f = dama(colocandodama) - colocandodama THEN repetir = -1 END IF NEXT IF repetir = 0 THEN colocandodama = colocandodama + 1 dama(colocandodama) = -1 IF colocandodama < 8 THEN repetir = -1 ELSE LOCATE colocandodama + 2, dama(colocandodama) * 2 + 3 IF (dama(colocandodama) + colocandodama) MOD 2 THEN COLOR 0, 7 ELSE COLOR 7, 0 PRINT " " END IF IF dama(colocandodama) > 7 THEN BEEP ' refresh ' SLEEP 0 LOOP WHILE repetir COLOR 7, 0: CLS LOCATE 10, 1: PRINT "En estas posiciones, 8 damas no se comen." refresh ' Posiciones halladas (cambiando el valor inicial de dama(0)): '-1 -> 04752613 ' 0 -> 13572064 ' 1 -> 20647135 ' 2 -> 30471625 ' 3 -> 40357162 ' 4 -> 50417263 ' 5 -> 60275314 ' 6 -> 71306425 ' Es posible que se puedan encontrar m s cambiando el valor inicial de ' dama(1), pero realizar tal cambio es complicado. '(en cualquier caso, si quisiera hacer un programa para hallar todas las 'posiciones en que las 4 damas no se comen, utilizar¡a un algoritmo distinto: 'probar¡a todas las combinaciones de 00000000 a 77777777). SUB refresh SHARED dama() FOR f = 0 TO 7 FOR G = 0 TO 7 LOCATE G + 2, f * 2 + 3 IF (G + f) MOD 2 THEN COLOR 0, 7 ELSE COLOR 7, 0 PRINT " "; NEXT NEXT FOR f = 0 TO 7 COLOR 0, 15 LOCATE f + 2, 1: PRINT USING "##"; dama(f); LOCATE f + 2, dama(f) * 2 + 3 IF (dama(f) + f) MOD 2 THEN COLOR 0, 7 ELSE COLOR 7, 0 PRINT "*" NEXT END SUB