Paver un rectangle avec des dominos
Définitions
On considère une grille rectangulaire à côtés entiers et parallèles aux axes.
On peut la paver avec de petits rectangles de côtés 1×2 ou 2×1, qu'on appelle domino.
Un domino sera codé par un tuple (i, j, direction) où
i sera l'indice de la ligne (on débute à zéro)
j sera l'indice de la colonne (on débute à zéro)
direction sera une lettre parmi 'NSEO' et indique le prolongement du domino vers
'N' : le Nord
'S' : le Sud
'E' : l'Est
'O' : l'Ouest
Paver signifie qu'on veut remplir toute la grille, sans découpe ni chevauchement.
Exercice 1
Coder une fonction pavage qui prend en paramètres n et m deux entiers positifs, et qui renvoie une liste de dominos qui pavent une grille rectangulaire de n lignes et m colonnes.
Pour cet exercice, peu importe l'ordre des dominos. Toute solution sera acceptée.
Si le pavage est impossible, la fonction doit renvoyer None.
Une fonction dessine est disponible pour afficher votre pavage. Elle prend en paramètres n puis m puis la liste des dominos à afficher. Vous pourrez donc tester dessine(14, 16, pavage(14, 16)), par exemple !
.128077.128013/.r;nbOylae%u)*d6z3×m(P+02@U],59fq!78 N_o=pcwgv41kRéhtsS[ji:E050r0m0%0l0,0k0(0N0T0k0l0(0(0R010%0,0S010406050(0o0w0w0l0e0j040)0Q0k0o120Q0g0N020l0w0S0f0N0!0m1c0e0J0o0m0(050c191b1d1f170S04051K1D1N0c1K170r0,0W0`0|0~100$0,0V0$0k1#0$0%15050=0h0k0m1W0}0 011!1$1(1$0%1.1:1,0%0e1L0%0$1=1Y010I0@0m0g1q0m010`1i0(0S0l0g100B1,2i2k261@291:2c0w2e040b0N0y0e0Q0S0Q0(0,1l1n0:2g0e0e0m0T2I1D2p0g1L0c242U2123221-0r2r101(0g2b2F1,1T1V0{1?2(0,2*0g0Q2.1,0S2N1L2S2U2 182j1n2:272^0e1c0k150N0Y2R3316322q351@37393b0B3e2k3g2S2%013l0l3a040N0u3p2T173s3j103v3x0N0X3B3r333t3H3b0G3L3D3N3F3u0Q383w3b0s3S3h341X3k3X3m3y0L3$3E3)3G3+3Z3y0M3/3U3;3W3Y3I0H3`3i3|3P040Y0A413(2;3}3,0Y3d1E3f3T424a440Y3o4f3q4h49363?3x0Y3A4n3C3%3O4s150Y3K4w3M4i4r3~4B3R4E1O2}1D2.2X0r232$3V0T2_2x0/1U1L2|0m2~3f3L054V0:4%4G1@0Z150:0I4)3:4a0U3b4@3{4j0I152j0W0l0V0m4|4.1014040x564q3k150g5c3t590F3L0N4y3V0g150w5h3V590p0-3S0N5y5m4^270(2n04011v0g0W0Q0,1;0o2*0N1(0(0%1;2K0r0Q0w2?2F0N1z0,0N512b0%0N5N0N2N2P2k0V1:0N0g0v0w015x5z5n434;5W5Y1C4E5A4}270Q150R5l5}4a590*0E5{5y6b274:040,4?636i5e045g6o5B1@67040n6a6u105X154m2 6457016w0R696t651@6C04474L6A01595w4E065z6Z6G5d106k0I3X6z6N3G150,6+6H0Q4`6l6s6F6p3G0h150e5:556S6,6U155b716H5p6r6:6$6I150c0c7a3t6P6E4(6T5u6W2 6Y6!7q6`016(6*6M77150+7g3V6=6.6^3f6#3O6|046~0g545s3|5975316T785r767b7m6g7q7Z7s785V5X2^627R726w0d7N4j150l0S0S2b0r7/277P7Q7k727i7A3|6w0q817:6l7`1@5j85367y8858155k7w7b0(0Y15000)008e73040p0p7Y7s6k0m1(6n6_7S5q8b6v156y8i7h0,6D8E106J6L8B7 8K6Q8q6V7Y6Z8w156)0e8M3u6.8$7C6@8$0g7I7K7M7V5i748q787E3q7s7X6X7Z6!8Y048!8,8d8I7B6?2?8,8.6 8U8?8;5o8D95827d7f9h4a809e7O155v8W8~5|8C047%618q7-8@7;7?7^9c5a7}8`9v6/9o6c8g8$9n8Q6;15849l8c047z9L7{9N9U1@8k8m0.8p9Y899q8u8}9u728x0^707+6H8V9/7r9v9x7)8)688$0Z0T150O1m9@4g7p6h6T6k2N0%0o0e8_2T7G9f9w609 6X1D4+4$4Mas0c4P1D0%4Rax2!2V0l1/au4P1J4-7b2N0w0P0I0l0Z0m0P0$0u151v1x1z1B0N7n4(1Q3g1K0D5O0(1i1k0,1m5!0o5$0g001B5*2j0_0%0Q0o0+a}0e0_0w1m0Q0T0$2C1c12aX1O3g2.3t1_1%1)1+aI3t2t2b2d152z0)0T0e135*0y0j241m4)4#aI304(arbk3V6k4=8q6?5m9+3G4 045153a89I727P9B79bN8r8h9Q7b7T9F9r9{ak3|5D155G2b5J5L5+5O5Q5S0N5Uan5Z5#5%0l0W5)b@5-2O0=7L5=5@5_8vac780,1r3X0%bK4{bZ0g787K7%cc727$b}7*7F7s6J8$6d6fb+906m93bYb$3t6w8HcG3V9Pcv6T8O9O8S6R9^7W15a!4o8~90929#6-87c#6I97ai3y7#9a7LbT2T8{9dcT3O5fa0047ecQ8LbZ8|7o9t9:6H7u8#c(789XcK82c*996}9bc c?7~7x047Uc@5t9qcW3Cd29|9;6.8AcNcrde0gcpbZ9Acldy0r8/c:bG9p5a8qcMbU9_9qc`6Kc}8Tdg04dp16dr9t7#5 7(2F9z157.dD047=7@dz9F0x9Hc;6TdMajcw9ScE9KdmdJb#dwdjd9dicU04e03qb,4a9%048n9*d~9M8s9.d1dYd37b9=0(dHc=dV9seke99V9~d%dBd)bXd-9EdUd;dL8S7je8d`049Tda86d}e17b6w0zdS4eef9Ze6cEe3dNe5e7d_6Teb000Oeee48=eheseu4/6}0;agc+e;c$ewcucXel3t9=cDd79geM668GdSeHe%7,688PeP8J15cSe-dnerb+8Xac8Z7vf56qeOeIcOdcd7c.8:eV9,dKd+c+eqb*ejd2cZfpfealeZfa6;fvfq6{dyfyfidJd=dI86dlfK9ic{9kfQ01d^fXeWfF4getabdt6ldvftdx7J2kdAfz8Nezd+codGd:eFc~f|8reif!4acPc(6Pfhe!e.dWaaf/f:dje|d(04d*g578eBd/eDfWd!c%g58agbeGc`eLg89VfMf+fAe$c,e(8lec9)b)g7e~et908yeo9Fgggifmf^gleygneA9Dgsgx74gu9J9FgIe`f)gAc(83eYc`eSgz4Bg.8$e)0ie,gefj8te:90aee^cEg!fGg:enep7lcVh5fn7Je@aha2a404a62*3$0cbFat2UaG1M1Lcf0V0N3w0%100a2f3V0%0U1w0Q0+8K0N0(0e0T1Z1}0S0(0-7e0T0r0g0d0+0(0:1(0W0e0d2*0%0c1$0c0+0:0TaP0r2VhJb3hM0C0Y0G0d0Y0d0A0c1?0;0(1E0W0V0c0Y0I0X0X0r0d0(ia2f120%1:100-0z0Y0-010c3y0.0~0l0j0m0tb{1;4V0g5R0ea;2Nb@1;52bt2kb`b 2Eag6~2H5+125Q0m0e5PaY0X2g0o1:ag0_0KbcaH0y1d0=54iC5J211;cfbS0`0e0#0#1;0Kj2i.4O0;0?0^04.
Exercice 2
Coder une fonction est_pavage qui renvoie un booléen, True si le pavage est valide, False sinon. La fonction prend en paramètres :
n : le nombre de lignes du rectangle
m : le nombre de colonnes du rectangle
dominos : une liste de dominos. Un domino est donné avec un tuple, (i, j, direction) :
i désigne la ligne d'une case
j désigne la colonne de cette case
direction indique le prolongement de la seconde case.
Un pavage est valide,
- s'il couvre tout le rectangle,
- s'il n'y a pas deux dominos qui partagent une même case
.128013/.Tr;nbOylaeu)*dV63m?(P+02-],59f!7}8 N_o={pcwgv4F1kIéhtsSàLj[i:E050q0m0%0l0.0k0(0L0S0k0l0(0(0P010%0.0R010406050(0n0u0u0l0e0j040)0O0k0n140O0g050b1b1d1f1h190R04051x1q1A0b1x190q0.0V0|0~10120$0.0U0$0k1O0$0%17050@0h0k0m1J0 11011N1P1R1P0%1X1Z1V0%0e1y0%0$1#1L010G0_0m0g0l0u0m010|1k0(0R0l0g120A1V26281_1%1|1Z1 21170a0L0x0e0O0R0O0(0.1n0g0L0=240e0e0m0S2v1q2d0g1y0b1@2I1;1?1=1W0q2f121R0g1~2s1V1G1I0}1$2S0.2U0g0O2Y1V0R2B1y2G2I2:1a272w2!1`2)0e1e0k170L0Y2F2@182?2e2_1%2{2}2 0A3228342G2R01390l2~040L0t3d2H193g37123j3l0L0W3p3f2@3h3v2 0E3z3r3B3t3i0O2|3k2 0s3G352^1K383L3a3m0I3Q3s3T3u3V3N3m0K3Z3I3#3K3M3w0F3+363-3D040Y0z3=3S2#3.3W0Y311r333H3?3~3^0Y3c433e453}2`3%3l0Y3o4b3q3R3C4g170Y3y4k3A464f3/4p3F4s4d4n4w3_3P4z4m3J483Y4F3!474o3_3*4K3,4M4C0Y3;4Q4u3U4C0A3{4W4e4Y3W0A422:4A4H4N0A4a4,4G3@4/4j4=4L4v4)4r4`4R4|3(0A4y4 4X3$4Z4E554%574)4J5a4B4)4P5f4.4Z4V5j4@4C0t4#5n4S3W0t4+444?5t3(0t4;5x4{4(5A4_331B2.1q2Y2L0q1?2Q3J0S2*221y5M1z5K2=4s055S0=2/501%0Z170=0G3z5y1`0T2 5/5E3u0G170m0(0%0N270V0l0U0m5@5)1216040w65563i171p5!5^01680D3z0L5:38170u6b5b6i176k4s6m6h0g5,0O0u2%2s6r3h680o0/3G0L6L6x66010(2b04010+1!60621!5|0%0B0_0L611R2y0v016K6M6n120S0Y17030L0!0g2u0.3k0.0(0l2E4z6M6N6c6z040q0#0,0*0N6C0(6l6/010O170P7f6h680-0C6-6L7g5+040G3L7l6O760N7x6c0O5=042%7B6s0g0h170e28636F3J686a6g7y6e7P3-6H6J72736.6y171+2U7H3h7i047k6w7g7n7W3~0Z0S170X3k0(647:6h7t7v0e7+4H177A7 6O7D177G88757K047M0g7O7T6c7R7?2`6p8n1%6H7p7!7#747I5,797b7d8q127-0c8C6d040l0R0R1~0q8G8m8k8x047)7~2=7m170o3G06737g6;6?2n0l618j4,8#801782847X177S8V7U7F8O6u8=47170,8|046v2:8w3C5,0.2B2D0.1o928Y8d6s8a7F6f957g760q6B6D7e8Q6G177Z8-8v9685770m0k0@8~1`7-7/9l8W040Q8G0(6=04000M00929v339y8?698G7-0B8G6C4p92949V7g9%045r5I9J0o9*3e9W3~9N17000)9S9s7Q9u9E8r8@9$0.9(9 9X9?2H9^1`9-9/3e7;8Xaa3m7g9`9P0:9~8_8la19g9t9Ya83~ae9)a2129-5wag9;ajac1%am000iap9:6O689U9@ahavaq6sayaw1`6jaA7h179#aX1%aC9e0J7q7#9m98azat9z0q91a=3-9Ga!9n9B9Da(67170-8G9n992C71aUau8t9w8v7s8b5.a_3~8Pb99z0.a!7-029C0fa!aWbk9X9f9I897E7wbhaYa4b08HbmbB1%bo0U0%0f9H9+7%049kaNar04bwbOby17bAbxbT8^bS8Ra^b!9h17bpbLbsa69.9ebnbz83bHb1aTb%9704b)bW7Cb,bKbMa|8pbE7Ya-9xaH127t2B0%0n0ebRaR807_047{0`8U44cabe7Fbgb*aub$aE8`bGcv3J7-0yc577cAc0b+04b-brb_01btb|a0bUb?bYb^cB9Xcx2Ha/8{cNcDcF1Gbnc2bLbNcj8`cicZ9;cT04bZcIcwb490c*04cEcN9nb c.c1cKbqb/17afc;aO8Xc?c^d36sbjcQ3@c|c$17c cW8 77d2ab7gbJc,cF6qc78XaQ3qca8.6Ocd0?cgc:akck7`7|cp4ccr8/ctc(8z7c6~92b3bE76cHcybT0CdXbudpdr5(d$ddcVc_a?dT8Bdy04d(didpd!ds6hc%d0a:d@d%c{b~c}dnd:djdq920CdA18dC7$dE7LdGcha!7^dLcoc9eg758y7adU9rd)bCd^e4d|d,dg17e3dYdkewa304bbe83~a{cNem040d0e0ndNdB9xc!78etd?eHb`d_d#8ReAcba#c~c(eAaSeEe#8Hd+e+d do8oeae2c}c-d}dEcleReT8ZdD6c8%046@0r0#0e0.1|0S709cdI8!eq6s81def0erc#e`bI7E8cfs3u8f8h8,d`excYeBb}dIaS6Iep7rdQ8;e0e5c$fudIe+7J7L7NeUfEcRfDc!dxe=c88udCcsfec?2)0%dSeZdVd@e%dafqe/9Je;fB6ofOf$eDedfkeff6fmeicfekeOclcn7}f5fl3hf8fa1f6|0g0%1!2y0~6%fcfe0.fgb8cqge3J7tf+d08f2i92fZbP9o6C2)evf|b`bVdf7,170pd7045CgNcC170He dJc/c}gQfNf#gK6t04g1dPeh8gejfR7sgadMgdfK6Ogg0L0d0O1m0L6Z0L0h9df(cscedHelf2eSfW190b5$0m2I2-hg5L1H5N2L2O2J0l1Yhj0b5Mhd0=0@0_0(04.
# Tests(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)