Problème des huit dames (2)

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

![Mouvement des dames](https://codex.forge.apps.education.fr/fichiers/en_travaux/huit_dames_2/mvt_dame.svg){width="25%" } ![Disposition valide](https://codex.forge.apps.education.fr/fichiers/en_travaux/huit_dames_2/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

.128013s3_8ufvy n7aêS1me(P2C4:Vjtwi][h*)6o;bcdgù/T0làqp.rFL-,=+k95Ré050N0r0A0m0C0T0b0j0M0T0m0b0b0%010A0C0W010406050b0f0q0q0m0Y0i040o0J0T0f110J0k0j020m0q0W0K0j0,0r1b0Y0V0f0r0b050Q181a1c1e160W041C1J051M0Q1M1O1J160N0C0h0_0{0}0 0F0C0O0F0T1$0F0A14050;0L0T0r1X0|0~011#1%1)1%0A1/1;1-0A0L0J0N1e1.0Y1K0A0F0_1h0b0W0m0k0 0u011?1Z010g0?0r0k1p0r1-2e2g2l1^2o1;2r0q2t040a0j0t0Y0J0W0J0b0C1k1m0/2c0Y0Y0r0M2O1C2v0k1K0Q2a2!0A2827290N2x0 1)0k2q2L1-1U1W0`1@2.0C2:0k241V1-0W2T1K2Y2!35172f1m2_2m2~0Y1b0T140j0p2X3915382w3b1^3d3f3h0u3k2g3m2Y2-013r0m3g040j0c3v2Z163y3p0 3B3D0j0w3H3x393z3N3h0+3R3J3T3L3A0J3e3C3h0I3Y3n3a1Y3q3%3s3E0l3,3K3/3M3;3)3E0e3^3!3`3$3(3O0*403o423V040p0S473.2`433=0p3j1D3l3Z484g4a0p3u4l3w4n4f3c3|3D0p3G4t3I3-3U4y140p3Q4C3S4o4x444H3X4K4v4F4O4b3+4R4E3#4q3@4X3_4p4G4b3 4$414(4U0p464K1L331C2@2%0N2+3z0M242D0.1V1K320r343l3R054~0/564M1^0)140/0g584%2m0B3h5j4-3c0g5g0C2e2L2N0C1l0d0h3C0C0/5o5d0 13040s5E4w3q5s5u2M2W4=5k1^5H0H0x3Y0j5Y0j4Y49140k3R5!5S0 0J140%5)5#4p0L142A5K3z5H5J5R5p5M041U5O5w1l5_3#5U3Y065Z5*5~0 0M0p14030j0y0-0Y0C2o0M0m2O0^0/0^1|2:1B4R6a5;3c5@1$6v0d0J0M0M0f0W0r1A5:5+015-045/4K6b5F015H0E65420)0M140Z3C0b0r6Y4g5H0D6M6c6O140G6/6U0k5%5X5Z6z5e140g3%6@5L3M6B0O2:723z0J5m042|784Z5N2K5P5x5(5}6U5H5W6x6a6|6N5f7c5i6S6}74046u1A6E6G6I6K6w376N6W6+6A7z6C6*7l736V140D7o35697q7X7x017t2T0A0f0Y7k356T7Q6!6$6(7O7V7X5Y7Z7t0r0@7;577I147U4m7?7q7Z6_7M767B6F6H6J6L7P5`146X8d7f86778h426-7e426P6R7+7^6#040R0Y1z686y6N6e6g6i6k6m0C6o2O0j6s8K0C0m0O1l3C8c7=7r6:7t700Y8o4p140z0d4k8s6N7a147d7w6N0k5?040Y2g0O7|3w7Z5{7K5 7*3l7,79140#8Z2m0q0C4H8}5G145V6{7Y8/8,8%951^8q9j7y617h638 8`7~048g7H6:858$8(7}6:8n7p9f8V6 718.9x8#0d4s8)6:8+7c9r2Z914Z8;8?0k8^9a7R5I9!9y9i9J6U6P0(9m0197998l6,140$9.859S5c7Q5U804u828A9K7c9M9.9l9*7Q859o5v5Q9w7m8f9%9L9N9Baf046.9Ea17^8,7v9Oal5|aea9aia6939_9L9A9s9C9caz6Q8r90848;0m0L7Gak9}14avaQ3U9haj3w9U8paAa8aVa4aD2Z8{9c9 3Ia17?aq8=0:7(9{aZ4g7.046%7{9ea_2m7#a?7)9.a{8w8y4X0Q5a554?bc0Q4_1C0A4{bh2)2#23252%aN1;2!4_1I9|3z2T0q0d0g0m0)0r0d0F0c141u1w1y1A0ja-2!1S1N040!0m0j0h8F6n6p7j8K1=0{0j320-6)0k0M1=0N000f2:0j6)0f1;8K2sb%1c0j7A0j1j0?5tb#1=1 0r0m0fb!0j231h0-2q6r0-0M6l0Ab_0k6t000-2~b+0-0X1L3m1J0v1lb,7)2gcj1;6r8N8P2rcC0j1lb 111)6)b}c41Acj594 7u0jaN0b0sab7i1l0E8$0u0D0j0#8M622Oc$8%0D0H0j0%0%0j0sc%c*0j9z9dbacTcI0P5!bb049z1Cd50j0:d4cTc%d8d10b1lcBbL2|1Ub,6rbL4~0T1l6v0j0-7%1Ucd0^5Jd5ded05b1n0O0A1scS5bd7dD550H0X0j0o6I7h1l0^bKcO6r2sdo0^dqdsbLdJ554Bd9dbd)044#d9dh0C2qcj180Yb}bT0q0n2C8M8O8Qb^3%d?0k0AcdbU0r0Y6t1=3d0N0#cQdP0!cn6o0YcRdB9Mc|dLd,e62TdX0jdl8HbL8Ld$0kdt0N0J2NcVdreb0j0n2(1=0-0O3C0j0Ub}ek1ccR1v042qbU8R7(cVaO1hb8eX0Gdaetc30^exdnb!6t7Nd#cxea0kb)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

.128013s3_8ufvy n7aêS1me(P2C4:Vjtwi][h*)6o;bcdgù/T0làqp.rFL-,=+k95Ré050N0r0A0m0C0T0b0j0M0T0m0b0b0%010A0C0W010406050b0f0q0q0m0Y0i040o0J0T0f110J0k0j020m0q0W0K0j0,0r1b0Y0V0f0r0b050Q181a1c1e160W041C1J051M0Q1M1O1J160N0C0h0_0{0}0 0F0C0O0F0T1$0F0A14050;0L0T0r1X0|0~011#1%1)1%0A1/1;1-0A0L0J0N1e1.0Y1K0A0F0_1h0b0W0m0k0 0u011?1Z010g0?0r0k1p0r1-2e2g2l1^2o1;2r0q2t040a0j0t0Y0J0W0J0b0C1k1m0/2c0Y0Y0r0M2O1C2v0k1K0Q2a2!0A2827290N2x0 1)0k2q2L1-1U1W0`1@2.0C2:0k241V1-0W2T1K2Y2!35172f1m2_2m2~0Y1b0T140j0p2X3915382w3b1^3d3f3h0u3k2g3m2Y2-013r0m3g040j0c3v2Z163y3p0 3B3D0j0w3H3x393z3N3h0+3R3J3T3L3A0J3e3C3h0I3Y3n3a1Y3q3%3s3E0l3,3K3/3M3;3)3E0e3^3!3`3$3(3O0*403o423V040p0S473.2`433=0p3j1D3l3Z484g4a0p3u4l3w4n4f3c3|3D0p3G4t3I3-3U4y140p3Q4C3S4o4x444H3X4K4v4F4O4b3+4R4E3#4q3@4X3_4p4G4b3 4$414(4U0p464K1L331C2@2%0N2+3z0M242D0.1V1K320r343l3R054~0/564M1^0)140/0g584%2m0B3h5j4-3c0g5g0C2e2L2N0C1l0d0h3C0C0/5o5d0 13040s5E4w3q5s5u2M2W4=5k1^5H0H0x3Y0j5Y0j4Y49140k3R5!5S0 0J140%5)5#4p0L142A5K3z5H5J5R5p5M041U5O5w1l5_3#5U3Y065Z5*5~0 0M0p14030j0y0-0Y0C2o0M0m2O0^0/0^1|2:1B4R6a5;3c5@1$6v0d0J0M0M0f0W0r1A5:5+015-045/4K6b5F015H0E65420)0M140Z3C0b0r6Y4g5H0D6M6c6O140G6/6U0k5%5X5Z6z5e140g3%6@5L3M6B0O2:723z0J5m042|784Z5N2K5P5x5(5}6U5H5W6x6a6|6N5f7c5i6S6}74046u1A6E6G6I6K6w376N6W6+6A7z6C6*7l736V140D7o35697q7X7x017t2T0A0f0Y7k356T7Q6!6$6(7O7V7X5Y7Z7t0r0@7;577I147U4m7?7q7Z6_7M767B6F6H6J6L7P5`146X8d7f86778h426-7e426P6R7+7^6#040R0Y1z686y6N6e6g6i6k6m0C6o2O0j6s8K0C0m0O1l3C8c7=7r6:7t700Y8o4p140z0d4k8s6N7a147d7w6N0k5?040Y2g0O7|3w7Z5{7K5 7*3l7,79140#8Z2m0q0C4H8}5G145V6{7Y8/8,8%951^8q9j7y617h638 8`7~048g7H6:858$8(7}6:8n7p9f8V6 718.9x8#0d4s8)6:8+7c9r2Z914Z8;8?0k8^9a7R5I9!9y9i9J6U6P0(9m0197998l6,140$9.859S5c7Q5U804u828A9K7c9M9.9l9*7Q859o5v5Q9w7m8f9%9L9N9Baf046.9Ea17^8,7v9Oal5|aea9aia6939_9L9A9s9C9caz6Q8r90848;0m0L7Gak9}14avaQ3U9haj3w9U8paAa8aVa4aD2Z8{9c9 3Ia17?aq8=0:7(9{aZ4g7.046%7{9ea_2m7#a?7)9.a{8w8y4X0Q5a554?bc0Q4_1C0A4{bh2)2#23252%aN1;2!4_1I9|3z2T0q0d0g0m0)0r0d0F0c141u1w1y1A0ja-2!1S1N040!0m0j0h8F6n6p7j8K1=0{0j320-6)0k0M1=0N000f2:0j6)0f1;8K2sb%1c0j7A0j1j0?5tb#1=1 0r0m0fb!0j231h0-2q6r0-0M6l0Ab_0k6t000-2~b+0-0X1L3m1J0v1lb,7)2gcj1;6r8N8P2rcC0j1lb 111)6)b}c41Acj594 7u0jaN0b0sab7i1l0E8$0u0D0j0#8M622Oc$8%0D0H0j0%0%0j0sc%c*0j9z9dbacTcI0P5!bb049z1Cd50j0:d4cTc%d8d10b1lcBbL2|1Ub,6rbL4~0T1l6v0j0-7%1Ucd0^5Jd5ded05b1n0O0A1scS5bd7dD550H0X0j0o6I7h1l0^bKcO6r2sdo0^dqdsbLdJ554Bd9dbd)044#d9dh0C2qcj180Yb}bT0q0n2C8M8O8Qb^3%d?0k0AcdbU0r0Y6t1=3d0N0#cQdP0!cn6o0YcRdB9Mc|dLd,e62TdX0jdl8HbL8Ld$0kdt0N0J2NcVdreb0j0n2(1=0-0O3C0j0Ub}ek1ccR1v042qbU8R7(cVaO1hb8eX0Gdaetc30^exdnb!6t7Nd#cxea0kb)cs1P3mbf0:0=0@04.