Problème des huit dames (2)

Aux échecs, la dame est capable de se déplacer dans toutes les directions.

![Mouvement des dames](mvt_dame.svg){width="25%" } ![Disposition valide](valide_1.svg){width="25%" }

Le problème des huit dames consiste à placer \(8\) dames sur un échiquier classique (\(8\) lignes et \(8\) colonnes) de façon à ce qu'aucune d'entre elles ne soit menacée par une autre. Ainsi il n'y a qu'une seule dame par ligne, colonne ou diagonale. La figure ci-dessus (à droite) illustre une disposition valide.

On considère dans cet exercice des « échiquiers » de taille \(n \ge 1\) variable. On garantit que l'échiquier est bien carré. Selon la taille de l'échiquier, on pourra placer plus ou moins de dames.

Le problème considéré dans cet exercice consiste donc à placer exactement \(n\) dames dans un échiquier de \(n \times n\) cases de façon à ce qu'aucune d'entre elles ne soit menacée par une autre.

Puisqu'une disposition des dames valides doit comporter exactement une dame par colonne on peut se contenter, pour chaque colonne, de ne garder trace que de la ligne sur laquelle se trouve l'unique dame de cette colonne.

Cette représentation du problème prend la forme d'une liste de n éléments dans laquelle l'élément d'indice j est égal à l'indice i de la ligne sur laquelle se trouve la dame.

Exemples de listes

La disposition valide ci-dessus sera par exemple représentée en machine par :

🐍 Script Python
# colonne  0  1  2  3  4  5  6  7
valide =  [6, 4, 2, 0, 5, 7, 1, 3]

On peut lire que la dame de la première colonne (indice 0) est située sur la \(7\)-ème ligne (indice 6).

La liste ci-dessous représente une disposition dans un échiquier de taille \(n=3\) :

🐍 Script Python
# colonne   0  1  2
invalide = [1, 2, 0]

Cette seconde disposition est invalide car deux dames sont sur une même diagonale (aux colonnes d'indices 0 et 1).

Vous devez écrire la fonction disposition_valide qui prend en argument une liste disposition contenant n valeurs et renvoie le booléen répondant à la question « la disposition proposée satisfait-elles le problème des n dames ? ».

On garantit que les valeurs présentes dans la liste disposition sont des numéros de lignes valides (compris entre 0 et n - 1 inclus l'un et l'autre).

Aide (1)

Pour vérifier qu'il n'y a qu'une seule dame par ligne, on utilisera un tableau de booléens, initialement tous égaux à False.

On lira ensuite les numéros de lignes fournis dans la disposition : si le tableau contient un False à cet indice, cela signifie que la ligne n'est pas encore occupée. Dans le cas contraire...

Aide (2)

La vérification des diagonales peut se faire astucieusement en jouant sur les indices. En effet, si deux dames sont sur une même diagonale, la de leurs numéros de lignes et celle de leurs numéros de colonnes sont égales.

Par exemple, dans la disposition [2, 4, 1, 6, 3, 5, 7, 0], la troisième (indice 2) et la cinquième (indice 4) dames sont sur la même diagonale : 4 - 2 est égal à abs(3 - 1).

Diagonales

La valeur absolue permet de plus de vérifier en une seule condition les diagonales haut-droite et les bas-droite.

Exemples

On utilise les échiquiers valide et invalide définis plus haut.

>>> # colonne 0  1  2  3  4  5  6  7
>>> valide = [6, 4, 2, 0, 5, 7, 1, 3]
>>> disposition_valide(valide)
True
>>> # colonne   0  1  2
>>> invalide = [1, 2, 0]
>>> disposition_valide(invalide)
False

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013:Lp(40ed3; 1jVo5_ên)h]ù6,qc[yFCuvài2+ms7=wlSatf-9Rrg.*TéPkb8/050i0h0U0T0J0R0N0l0B0R0T0N0N0P010U0J0d010406050N0G0M0M0T0Z0D040S0p0R0G110p0t0l020T0M0d0k0l0Y0h1b0Z0A0G0h0N050-181a1c1e160d041C1J051M0-1M1O1J160i0J0H0_0{0}0 0v0J0!0v0R1$0v0U14050;0+0R0h1X0|0~011#1%1)1%0U1/1;1-0U0+0p0i1e1.0Z1K0U0v0_1h0N0d0T0t0 0K011?1Z010V0?0h0t1p0h1-2e2g2l1^2o1;2r0M2t040a0l0)0Z0p0d0p0N0J1k1m0/2c0Z0Z0h0B2O1C2v0t1K0-2a2!0U2827290i2x0 1)0t2q2L1-1U1W0`1@2.0J2:0t241V1-0d2T1K2Y2!35172f1m2_2m2~0Z1b0R140l0m2X3915382w3b1^3d3f3h0K3k2g3m2Y2-013r0T3g040l0j3v2Z163y3p0 3B3D0l0f3H3x393z3N3h0q3R3J3T3L3A0p3e3C3h0y3Y3n3a1Y3q3%3s3E0O3,3K3/3M3;3)3E0,3^3!3`3$3(3O0X403o423V040m0g473.2`433=0m3j1D3l3Z484g4a0m3u4l3w4n4f3c3|3D0m3G4t3I3-3U4y140m3Q4C3S4o4x444H3X4K4v4F4O4b3+4R4E3#4q3@4X3_4p4G4b3 4$414(4U0m464K1L331C2@2%0i2+3z0B242D0.1V1K320h343l3R054~0/564M1^0*140/0V584%2m0Q3h5j4-3c0V5g0J2e2L2N0J1l0r0H3C0J0/5o5d0 13040e5E4w3q5s5u2M2W4=5k1^5H0u0b3Y0l5Y0l4Y49140t3R5!5S0 0p140P5)5#4p0+142A5K3z5H5J5R5p5M041U5O5w1l5_3#5U3Y065Z5*5~0 0B0m14030l0o0(0Z0J2o0B0T2O0^0/0^1|2:1B4R6a5;3c5@1$6v0r0p0B0B0G0d0h1A5:5+015-045/4K6b5F015H0C65420*0B140E3C0N0h6Y4g5H0w6M6c6O140$6/6U0t5%5X5Z6z5e140V3%6@5L3M6B0!2:723z0p5m042|784Z5N2K5P5x5(5}6U5H5W6x6a6|6N5f7c5i6S6}74046u1A6E6G6I6K6w376N6W6+6A7z6C6*7l736V140w7o35697q7X7x017t2T0U0G0Z7k356T7Q6!6$6(7O7V7X5Y7Z7t0h0@7;577I147U4m7?7q7Z6_7M767B6F6H6J6L7P5`146X8d7f86778h426-7e426P6R7+7^6#040%0Z1z686y6N6e6g6i6k6m0J6o2O0l6s8K0J0T0!1l3C8c7=7r6:7t700Z8o4p140n0r4k8s6N7a147d7w6N0t5?040Z2g0!7|3w7Z5{7K5 7*3l7,79140W8Z2m0M0J4H8}5G145V6{7Y8/8,8%951^8q9j7y617h638 8`7~048g7H6:858$8(7}6:8n7p9f8V6 718.9x8#0r4s8)6:8+7c9r2Z914Z8;8?0t8^9a7R5I9!9y9i9J6U6P0L9m0197998l6,140z9.859S5c7Q5U804u828A9K7c9M9.9l9*7Q859o5v5Q9w7m8f9%9L9N9Baf046.9Ea17^8,7v9Oal5|aea9aia6939_9L9A9s9C9caz6Q8r90848;0T0+7Gak9}14avaQ3U9haj3w9U8paAa8aVa4aD2Z8{9c9 3Ia17?aq8=0:7(9{aZ4g7.046%7{9ea_2m7#a?7)9.a{8w8y4X0-5a554?bc0-4_1C0U4{bh2)2#23252%aN1;2!4_1I9|3z2T0M0r0V0T0*0h0r0v0j141u1w1y1A0la-2!1S1N040c0T0l0H8F6n6p7j8K1=0{0l320(6)0t0B1=0i000G2:0l6)0G1;8K2sb%1c0l7A0l1j0?5tb#1=1 0h0T0Gb!0l231h0(2q6r0(0B6l0Ub_0t6t000(2~b+0(0#1L3m1J0F1lb,7)2gcj1;6r8N8P2rcC0l1lb 111)6)b}c41Acj594 7u0laN0N0eab7i1l0C8$0K0w0l0W8M622Oc$8%0w0u0l0P0P0l0ec%c*0l9z9dbacTcI0x5!bb049z1Cd50l0:d4cTc%d8d10N1lcBbL2|1Ub,6rbL4~0R1l6v0l0(7%1Ucd0^5Jd5ded05b1n0!0U1scS5bd7dD550u0#0l0S6I7h1l0^bKcO6r2sdo0^dqdsbLdJ554Bd9dbd)044#d9dh0J2qcj180Zb}bT0M0s2C8M8O8Qb^3%d?0t0UcdbU0h0Z6t1=3d0i0WcQdP0ccn6o0ZcRdB9Mc|dLd,e62TdX0ldl8HbL8Ld$0tdt0i0p2NcVdreb0l0s2(1=0(0!3C0l0Ib}ek1ccR1v042qbU8R7(cVaO1hb8eX0$daetc30^exdnb!6t7Nd#cxea0tb)cs1P3mbf0:0=0@04.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013:Lp(40ed3; 1jVo5_ên)h]ù6,qc[yFCuvài2+ms7=wlSatf-9Rrg.*TéPkb8/050i0h0U0T0J0R0N0l0B0R0T0N0N0P010U0J0d010406050N0G0M0M0T0Z0D040S0p0R0G110p0t0l020T0M0d0k0l0Y0h1b0Z0A0G0h0N050-181a1c1e160d041C1J051M0-1M1O1J160i0J0H0_0{0}0 0v0J0!0v0R1$0v0U14050;0+0R0h1X0|0~011#1%1)1%0U1/1;1-0U0+0p0i1e1.0Z1K0U0v0_1h0N0d0T0t0 0K011?1Z010V0?0h0t1p0h1-2e2g2l1^2o1;2r0M2t040a0l0)0Z0p0d0p0N0J1k1m0/2c0Z0Z0h0B2O1C2v0t1K0-2a2!0U2827290i2x0 1)0t2q2L1-1U1W0`1@2.0J2:0t241V1-0d2T1K2Y2!35172f1m2_2m2~0Z1b0R140l0m2X3915382w3b1^3d3f3h0K3k2g3m2Y2-013r0T3g040l0j3v2Z163y3p0 3B3D0l0f3H3x393z3N3h0q3R3J3T3L3A0p3e3C3h0y3Y3n3a1Y3q3%3s3E0O3,3K3/3M3;3)3E0,3^3!3`3$3(3O0X403o423V040m0g473.2`433=0m3j1D3l3Z484g4a0m3u4l3w4n4f3c3|3D0m3G4t3I3-3U4y140m3Q4C3S4o4x444H3X4K4v4F4O4b3+4R4E3#4q3@4X3_4p4G4b3 4$414(4U0m464K1L331C2@2%0i2+3z0B242D0.1V1K320h343l3R054~0/564M1^0*140/0V584%2m0Q3h5j4-3c0V5g0J2e2L2N0J1l0r0H3C0J0/5o5d0 13040e5E4w3q5s5u2M2W4=5k1^5H0u0b3Y0l5Y0l4Y49140t3R5!5S0 0p140P5)5#4p0+142A5K3z5H5J5R5p5M041U5O5w1l5_3#5U3Y065Z5*5~0 0B0m14030l0o0(0Z0J2o0B0T2O0^0/0^1|2:1B4R6a5;3c5@1$6v0r0p0B0B0G0d0h1A5:5+015-045/4K6b5F015H0C65420*0B140E3C0N0h6Y4g5H0w6M6c6O140$6/6U0t5%5X5Z6z5e140V3%6@5L3M6B0!2:723z0p5m042|784Z5N2K5P5x5(5}6U5H5W6x6a6|6N5f7c5i6S6}74046u1A6E6G6I6K6w376N6W6+6A7z6C6*7l736V140w7o35697q7X7x017t2T0U0G0Z7k356T7Q6!6$6(7O7V7X5Y7Z7t0h0@7;577I147U4m7?7q7Z6_7M767B6F6H6J6L7P5`146X8d7f86778h426-7e426P6R7+7^6#040%0Z1z686y6N6e6g6i6k6m0J6o2O0l6s8K0J0T0!1l3C8c7=7r6:7t700Z8o4p140n0r4k8s6N7a147d7w6N0t5?040Z2g0!7|3w7Z5{7K5 7*3l7,79140W8Z2m0M0J4H8}5G145V6{7Y8/8,8%951^8q9j7y617h638 8`7~048g7H6:858$8(7}6:8n7p9f8V6 718.9x8#0r4s8)6:8+7c9r2Z914Z8;8?0t8^9a7R5I9!9y9i9J6U6P0L9m0197998l6,140z9.859S5c7Q5U804u828A9K7c9M9.9l9*7Q859o5v5Q9w7m8f9%9L9N9Baf046.9Ea17^8,7v9Oal5|aea9aia6939_9L9A9s9C9caz6Q8r90848;0T0+7Gak9}14avaQ3U9haj3w9U8paAa8aVa4aD2Z8{9c9 3Ia17?aq8=0:7(9{aZ4g7.046%7{9ea_2m7#a?7)9.a{8w8y4X0-5a554?bc0-4_1C0U4{bh2)2#23252%aN1;2!4_1I9|3z2T0M0r0V0T0*0h0r0v0j141u1w1y1A0la-2!1S1N040c0T0l0H8F6n6p7j8K1=0{0l320(6)0t0B1=0i000G2:0l6)0G1;8K2sb%1c0l7A0l1j0?5tb#1=1 0h0T0Gb!0l231h0(2q6r0(0B6l0Ub_0t6t000(2~b+0(0#1L3m1J0F1lb,7)2gcj1;6r8N8P2rcC0l1lb 111)6)b}c41Acj594 7u0laN0N0eab7i1l0C8$0K0w0l0W8M622Oc$8%0w0u0l0P0P0l0ec%c*0l9z9dbacTcI0x5!bb049z1Cd50l0:d4cTc%d8d10N1lcBbL2|1Ub,6rbL4~0R1l6v0l0(7%1Ucd0^5Jd5ded05b1n0!0U1scS5bd7dD550u0#0l0S6I7h1l0^bKcO6r2sdo0^dqdsbLdJ554Bd9dbd)044#d9dh0J2qcj180Zb}bT0M0s2C8M8O8Qb^3%d?0t0UcdbU0h0Z6t1=3d0i0WcQdP0ccn6o0ZcRdB9Mc|dLd,e62TdX0ldl8HbL8Ld$0tdt0i0p2NcVdreb0l0s2(1=0(0!3C0l0Ib}ek1ccR1v042qbU8R7(cVaO1hb8eX0$daetc30^exdnb!6t7Nd#cxea0tb)cs1P3mbf0:0=0@04.