Apagada docs

Aprendiendo a programar el pasado

Herramientas de usuario

Herramientas del sitio


es:basic:qbasic:8_damas

8 damas

¿Cómo colocar 8 damas o reinas en el tablero de ajedrez, sin que se coman mutuamente?

8damas.bas
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
Este sitio web utiliza cookies. Al utilizar el sitio web, usted acepta almacenar cookies en su computadora. También reconoce que ha leído y entendido nuestra Política de privacidad. Si no está de acuerdo abandone el sitio web.Más información
es/basic/qbasic/8_damas.txt · Última modificación: 2025/02/02 21:44 por nepenthes