From e74af821f2e28d17b60f9237980bab68110ce6c8 Mon Sep 17 00:00:00 2001 From: Alexandre Date: Thu, 7 Nov 2024 21:17:55 +0100 Subject: [PATCH] refactoring of BFS functions --- bin/main | Bin 227310 -> 222793 bytes input_test.txt | 18 ++-- main.cmi | Bin 5940 -> 6332 bytes main.cmo | Bin 26551 -> 21036 bytes main.ml | 278 ++++++++++++++++++++++--------------------------- tp.txt | 10 +- 6 files changed, 140 insertions(+), 166 deletions(-) diff --git a/bin/main b/bin/main index 39de58c6e2030e42c72cb37d2e8365ce259321a4..bef0f9a1bff570295e0c6fe539ed9be11a2f2142 100755 GIT binary patch delta 5137 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 delta 8369 zcmeHMeQZb^3v%S|a?nc$wuyT8Du=^y7mJ6w zMrEk_9p!Lr=Ep@W2UrA4gm!%>8|b-FIg_3ql`i^LK!xXC%Oj;MQ0`?}%TmDtjWU)5 z%NSpNZrS*VoY97E7_Vn3Vp+j*XZk+GZHxt1D~pT8&7#dfHUQ`t{H>*=)d6IrvckQ}6(M66D}nsxxEMii*weHogAVC0jJ99FklV0#R! z2JWe*!r}pGLU6X2JOFIUgXcEBJe*Oj3kxnp-bG~}$dD7aK5T^` zy(^R}QOwVh#hPR8%8Cm1OFIin3Zk>5UHG^U8}`SH5H=fG5Y?}Cu#PqJTLy3?TiW0hr7-S<0`=u39`Lb%u4z4h&U<>rkwPnVqSA}R! z6`$6{+6{b05Obo^(^HjWM9`c=+}lMEYFI&`2%(!n$oF|gP&@Td<*;mUf}<664a?v{ zHzym^ZKa>5*bhqY5pLl!!h#~fH-n!}uqti*P?poNfU5h#b=-MvdeEF1yRQwpTB>js zS2xx*W{09w)0xo}rPqBG;w>oHRU{N@{Ot&ez^@S5R%-f=O!+K7qPkQLo+E^8}x ztnE^;L*IgZYOw}L7%|bD)1W!GQ_~zJM`W|JiYFD*u3@>x2Zz_QWS^HkhnXYsm5VsK zXlPUhonSd1^^Nk8`HfNO73K7|QMtqi_MCXC7Ij3Yj#$A7xde~v71%SExffP7_hC1+vtS27;0+PeahNJn z=%RWd8(G*dj#-`w1!D)fz@t{a7J758?L)KSFvR3oW% zGbq_c-jUSGCN2^wE-K4#Q4epO_6$R?b(_XL%mxPr_is zJZxbwyHnYvG1zo=Vm;Ad=`Gxk>tcIO*9EFL9rl(KgK@{j3d)Wf;C%cbW-e2>(B)_c z8{sSzHgpZD7)Kq=z_;!LJJ>l6U}l`UDyKpgHsPHtx{a9tLD7s;JI{mQte6p-LNLQ6 zbdk4$Vyg{IB)Lj15}b^Jbo)R5PjdM&jxHrs^Zzu-0U*Fa^nT7Fxo7yTSl(~JP|Y1I zs9=cR2-MB|h`;TNVkygIankOfFW>sxS| zdH7Q!I2~JKY3#cY%v$#|CAg}8$tARVSYCldIKIn*BVAGdp1mP@>6{!D9kl>14;e3VxWx}jtV(}n{+#c@ndtN3H)qHVlL&U|C#blNR-KU{-{af^BbbbL#OW7u z(SUOK-24m!-(>kR+V8!idfeDUu;Zgvp+cUU_!bu?`e~0(h3E;PnrN?2)flg^Bhz>U zzee!R11BroBZ?Z3@mjrkuK9SliHG3_@6fAR>{UbseJs^-@f}*A)N)Te{XKzS0XpVVGn30o)V+dw`8mnY2Lv5V4>cu^l&UKP6_>Du`f_!f z_(gI@xw=t^{j}es4vAmVeHHxpA|0(zkJbVW1hGSO>R9lH&95j?sT#x(?Ll*ZhS2<) zPE@K^@e(cZs+Hnp<3AmG!mC{3724(qCdS|WZ&4M7zWzfU!PNHu>GsdmT&p(EI>wcO zVs2)^^#VWN#q9=``&pp!79Fou!Gw9*Zj0KzmghFh^XDwj&z{eAyVUX=wLJgl+?X6I z?H@}tH`XvBpv8X|Po7QvLyAp@K7{MOvvkYPvWPjJC3?iaJX$L5euyh(|&Ak9#{ng!!0 zlRuoUcGvqG4l>-?Y`T;8PrJ)e@?di17uE5a#NyWY&h2-1-4ovsZt3ohZ`(q;qI$G7v&_FDPax|{!m)f>;MpwtXzjjaOiq3BGuUEH< zzb4z)tGMvK_j>G+rZwH|o8mjSbPI7Z`PK&2Q{ugIU)SkfZ*K2B|L~gMT($OrYPut? U_Q`p7kh??G%Z9gUPKOHr7rzDO*#H0l diff --git a/input_test.txt b/input_test.txt index 7d9cfdd..36eba2e 100644 --- a/input_test.txt +++ b/input_test.txt @@ -1,19 +1,19 @@ 3.7 0 7 11 -0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 2 0 2 0 2 0 0 -0 0 0 2 2 2 2 2 0 0 0 -0 0 2 0 2 0 2 0 2 0 2 -3 3 3 0 0 0 2 2 4 4 0 -0 0 0 0 0 0 0 0 0 0 0 -0 0 0 2 2 2 2 3 3 2 0 +0 0 2 2 2 2 2 2 2 0 0 +0 1 2 1 2 1 2 1 2 1 0 +2 2 2 2 2 2 2 0 2 2 2 +2 1 0 1 2 1 2 1 2 1 0 +2 2 2 2 2 2 2 2 2 2 2 +0 1 2 1 2 1 2 1 0 1 0 +0 0 2 2 2 2 2 2 2 0 0 3 3 2 4 4.1 4 4 2 4.3 -0 0 3 5.5 +8 6 3 5.5 5 -2 2 0 3 2 4 5 3 +0 1 0 3 2 4 5 3 2 0 1 4 3 2 2 2 10 5 2 0 2 3 2 3 5 5 3 5 1 10 2 3 diff --git a/main.cmi b/main.cmi index 116a3adf88d77318a3a46d2329ca10128aaa77d5..5e6b5e87e31952b32476f2e12871fa05d34c9ad9 100644 GIT binary patch literal 6332 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%0A+TYXVv-cO6s8&BRYP%y2hNaEqtR23P{UXF~7U zm=a%^>V?HTWdW{qEM=;`hXC!2!&HG@LiHD}F#_NMWcPt=+>7W)vyjO(R3Q6!XX~>K z$6FT^p#iJ~_4BHX7jm}+{8hl;xQPbv6=Z9W?Lw0hvw$aB98e)3`|Wo9T{hsmY?6WB zYxvz4(O+hVZ8aCy(P{P5o*8xi#JZlPt?!ORy6Epc9FBtGsj5G0^Y;BAv^`Mu(2gF5 z4&EOB>%>T;t9eI0-$lZB9<~i}_JO&_9c526 zyfEaA*wT9}CL=;xNDJFa*R}6HA$mHY{oAjV9^Em1w#6imoj*##w#L4-L#`Jrt1Dc4 zdB=jMK3NutbTdr`;cLKPkvnX=QLQdc`1Shs*0XOH9^3Lt1B=lB_G&$B>tB2FmNz4# z@^v_|Wa+|-rIAQyQzeU6SN%HeVtvK#s=U2bqqAltp0Xs#43(5<*dnicSJs!l`E%T+ z=2a&fjXpEY;*!DMq=apSZ3`|}583?ov5k#3#2?t*ClWEGFhig06)=WF&JoJIlmxN*; NO88aSH-Zm1{|D1hll%Yx literal 5940 zcmZu#33L=i8m_;)dXgZZXgKt(E`cN@l7vCTYZF$(tcx_0)IN(N)!5 zpw{{N=H})ObM|x2U-s-aLOMGMq1l97Q%K0w-|49%Rj*&)pr?7Xs^}Du&+j)j#+p;B z0s-G(SIi|T=S~tAT)EG+!RS?oRdecmg#fn!+-^|GL@t-BiFR_iQ03+tHKO|55pSIa z@&zuHR^tn(k-|8w`%#NtGZ7M7(x9dHE5s-gLBxC?VRsDpXQcuRZ zSgxL4edICQNy>%o=21wi44^6Z%pJ&7#s;dI|VqD4|^$nzg+x7X~jy!-; zMI|5|0O_DXhnVOn6DlvlgsEZgJsPRxET>@2MONu(kdA?L+@NDjbegfMh9E1$qeXZp zlX09`BA9cKd3PyDXF&Sipl*(2!kGS{ajmNw1=3FZ7_@o}$N;irwk|Z7w=O;CQya7p z$d}^V=k<^Y+^ywGdp#ueF0a9jHfSdwyPlL`e zQ5K^-HXJGG{%}y!JY*8L@(SL=$Xi$mayH0)47$ifcQD?{5y;E(vmtS-k$}HiBX@Il zRIndH_VRHc-wCqIpesx?ma*52M0RgZ4yhh*G)&x_JXeq(L~`?Zkjp@>Fz7QTn#RZ* z??Q5#-=l`7lF6L5SkUGp?WGAI*MeMU&tHYA{Sx&U;+&<{|Hmi6Gw# z^8E(gYNCaV_ijntAhu#0iXVd-lR#bs@?vuk_YLENn1(lT81JNC3JmCiU zG5i?xB;GDtKyEQJ{xBLdZqTzmT8$d@Mclyv-r68v#x;Yk5iX0^t$4-*@>Y-ygPt|f zUS@N7EECAG1B{UvI z4FwzlpaXyoLYQE}Vy@Dq{0|MWI{gY487V{_<098J0DT+iUKB|-;ip`rX9W}K6%A`X zEgS|)klqwql0GKl@p-FyhO`r!V@92d0aeOC_cqnd^^blSw6L@fz&Z>bDA0osSQI}E2+b5>+M2qrGQTexQcnW zNdYJtC{qwmw(!H;BQTNQV{BrCiQh~(OtAmW*tMh(lm(zXg4kzaowM(qglxQp7&*Ym zG!10Uu{t_maV&G=b8L_&y7>eMNzVccWH@-|Vk237T0n!C%h!50fHL3{Z9; zUSMH!b}V-zzn4v)&eOP9nnoe9Ou&CJwdG_8C`Uj!hIoaA+jyEalbIT>mbf~ENyrQn zx7aOZ^ky;?l;6NX5I@9SaRcI4Ej)mW z?W_`Og#w%LsG7!gq1Ek31}TAy*(Xtm^x$Dxc=&#o>s(;G-Re#`><7` z5^H~AVK=Y+O%2xWmG28w*W&I~Z`D6()tQX-Kew=#*Z*-!eA7=^zYU_4UB*fCbG5lb z;=1S#)Zm?Kwp-qBYhoM_?CxItGhTY56;0yDI+4M7d4 z5;tnS2ZyWGpjN1ni{A>$z-3leahmAYDZ2p3DQ#SYHG4xU*SEC{I)EevF? z#rnHdb11U9TezIF`uLF5d$`xfuIgwgq~YucN7P6ZH;n|gX(-T7 z0VmU+ zMM@W!)}iH}9~{W@_DorCgBQ5{bW#n8=OFPS+J{V>1l)e^bY`C#o~Z_bCRvkRY!CJ$ z33*XCzhvGKe|kC~8~A0KC@Q|pBS!t+NRhbsik)nu4PLduCZ2T#sez}+ud%{Tw5L$=vYt=wrB z@k7!lkc1nFwA;dGxYI|o;+*1+7wxT4Q((1dv+-9}+ij~I-0BEvfc60G6|_2P;bd-g zdN#A_XEn-PuYB4J&4<&z!|!&>`7H!1@ejQstal3dmVp1kN;iq(E<4I@9_2icCD5rm zbV|i67wp1qER5_RMJ!FWwK9hz*ws^jcC>Odr<+$s3GqFw@qc`HC2!k??=VBT1CXa7 zIUADuVxgm5xRV>+NQ!w+GebXHr)|rtElb)}c)iQ#TTGFOxb_~u_7?|ASv(n&y`uj6 zn3rzCZd9aB;%eL$v)>MXzy=@K;2>{KE|Arb{1qgBhs_yi7x=kb9!5s7=JXD#p|FN~ zPB4nA%r$mX3WVW@I7Bl=@sMrt5w{o)qy@TO4_$9WixGAqgZJ13GM-u7JW~z%-F%_| z?PNMAk}4!WwmWOIxONzu4M9=<#J2s^21mGm6_7Sa84W3A=wEFY_+dZ}ky<`t=C19= zc^e3MBY5J!)(Qc$guziBLVx5c04C({=2L1a~dnSi%R^Bh)|V7p95}CvBH6#I-NEVGQu`p+_O~z@1iZvA3)ki_9u9$awmW{e(EAQuHH?E-%Wqgg<s@du}U# zsI#tTo6qlVcUkpRH579Oa({?!3NIbF<(7SWE>CEir0Y3$jWK)|i8*uTOrIremSAGTb#-0s20^?&f2F^`c5>Cv`g8% zuJ(g16K2Jkl(0iVP0ZObxU%>{*`pgOSDxN7Z^8SI>UtmBWGKGLid6Yx&R?3;N7}Vr z*mT3J%asRTSbbHTQ4xEk8*>(}IeaOQm)Gzj99p<|{@1m-o@J{P@aC$gdVSqe-@3G9 z$I|kGnLR#@OOhY0snM`UUJNX0seR>q;`7N%4|ga(IxWs6kG&CyIV*1}JKa>ge)GZS zI;>6F)jB}et+ygEXLe$G&9>P)S{nVKez}pxAgun zn6=#SvH!jIzyJ5%=bRf|*0Q~8?vf=-)`sVYEo;Hu8!gMq9&cH7=<9(@pcPmQunABB zIA9CFrv0Ae(4r5N zKOKkwZ07>r{fra+)4keLMg}kz8R=}G9@?z_(iX4oRQt+YofYWYflh#YjPa$w*}z(W z`JycHX9H^YGSIA(Zh(9I>rI%O=&o~(b;bBI4l0BC$^q^#aeMMI=G?3NoC^RBKtEY` z69CSUSLJCv7GsY4b>7Rf3G?KmPTE2rxXzlO%tnAs>x#KyT@?bE0AoSBFLUW4^yK0E z#Q@{>jbq1-F&DarJ?$n`F7;OcwB@5N|EE9)0s6&SqFs#hE`WTTXJc&1$C_c=57YrX z*R+F;Jd8Q@oDPszKi8T2c7XBWSodBgd)mc5$L$$Ij%}b6XaFeV+kZWF zjJ&Kz)&cn$f68WUu;-lintzq;V2v`FC&rAm!hOoeeg0T(!5rHKfabUuG;4=)nX^>@ zW5O|G%`thXhvS6+o5qXzXI*UrXpjF+dN2N=ERT)FKl1&(_~*@s)&zUUjh8on%B%VR zd&nPc)_jb`Kl1)P`8SsH$2)*^&V2DKaS!Ks$LN0THOG^%<^XzzdG=z!hjD(q_VH|w zW*>8u%0Bw`UhPwV)&ErI+iM?Vkjg&4oK*JFxA$Wo{T-`)Z6ny{m6OUo?)BUEUhY=w{$+V4pY$Mi1EyHWRP z&;8UveQImeof}DS8F=V#1<($30(_UC4@>Y8v!=039VIqFJ`Q1x85Zm z#Jltw9D3$X&m{dC%b8^U*t}###;$8Y}$l<-fJTWGIJ+y() zJhG=vsrZ&*o_Qe1$9$;0+Otmeos)XE0jvlAeaQJJKz_|5$T7c@mw}hH!Jc~9Gk)xu z8}`(z@8Y!i;lJTsoU$E&GFhA6XBq2)@!%X|(nNqi^rkKJ{1a9nC(*AeDW7IjQWUZ|}!G`a4$p+D5R?D<_qG z-0QcGcOPqrbvxR3)(7z}05#SpfDHV@`k-Fz8NVRFJBhhg8su@`>%60QCvD*Z+FGC; zV14o)&@;@txC-DJ=b1ysh<6WV=yQv*_>MrGyx-IDg_oL2ct%s{-Cj?7!xdy$$>6H)~ky8l-tPagMbyQv804b;d6XSO#be zb3m(|8n-gcF-Cl+)ia|t?&qZ}LeD{}7<0YJmDP!!aixAecZWgixzk!;Pnmvwl;hw3 zMR$KDdfHAO)feifu3muk*bPvwpO11`lU_cxWfSIEOO#U%&_~9NXOTS2tDenL&HUcLBABG+8p{~F{U%}zR{`%=4)etL zQ6^=r2F4{IqD1Z!~Hs@E#7=ZFlK8^cE(rci!$^%?adiuLcOEq z?BNe7XJ-_i>bK^VdGY3zJn8Z}7i-?UGPW9rk#fpddh^K~cyq}dc=H&+ zm@Q)ddt$t4^ZSYSkN(DZ)AtI1G1dE4e^<=JoW_8@61xCCE9o2WAYE5Esh*!T;G=xD z{XiX153rtiPwU;p_)$LZbJid4UF!TSK%LAZ_mlxV6RUtAKsz|^eSg@4u><4+Tx0&( zQ=ZcEK-U6#UwQX)-#-9hU%&pPK`)lc2LD-^Rp({Jv()vXoQCiheVTw@HWQ{{4w?Mi_DbB*l^ zfc`UvY?RRjr1DqulFkp-7Hy}jaXvmTbYk+x9CkspF-DMF8G|fA8ur}G6fOPAc`{m%# zd@!G^DbA5jwYLiM-n}E$z-i!R?WFU8a+q`0hu@BL^*9Z@lu19euDpBImsGavnH?>k zuYZ8~9Q4V8+2&n1oqZbH72r!31ICjvCfIDu+Ga zKm2?n<&n7`OCGnufcEB*^{cUCOuRYtuF*%X`*Y~$87UUj zJC<0y=*A)l{!D=FbHF(O>qzfJu2UWx^?JwGU`&0qPx-y~d=2I^05(2HDVJa!@L9yW zvH}=s@BjB&9qg$GG$!q!F98@A-sg;kcaF73A9)5o1CWm~;ePtbImV20Dx3V2!#!FT ztaWLi z8pnR{>~ZcCfcCI)Oq(JA8^@;_>iGBDXK|)j4-M|x-58Tszk$@Q2cqp{$2becaHh|6z25q)1Gp;hqbl{>l(v!J@dwzWmDUDZuGgrp7$?h@-906-Q#^; zi?RBXhjsGnets)*?6^H`=eQV9zbfAu{@b%!b+ZKQvd0QWHNW8I@UqD|aOo7k)08aL(R8o_TA z_TKn$%;y1n)(QJEw|CrLZLD_3wQe7D`+B#Z<@O=B54-(5w_o7)tRd>*GmHIFw?EnK zSxcOc0Hif$%p>U~0Nb7$zWOMBN$5g$cH`?0S6cCM#3X1{pV`vUy-pU~lt}E`KYK$w z+SReOx%uNeVmo5zVag6zO^L+7!ARoZ8Hs`W=bqcz*AkEQZ+05v@!0m>xO3m&%0=wYfmxrkqEl`mz*HGChD@4Mj}>} z28PtYb$uP(@iwcACe9b@02k-z;>wo(_W0H=v5puIM1qOL_48Ztf7fbm>FaCR)x0eh zZ*GZ3`$Se^#kNJ(vCkH{hJCIG1YU3Fi#*GIqR0#E3njy5f0AU3XI~;2YuJ}cMi=@} zQbRP_+}7385|@ktOwKlw+u}O+GB@N%#=ApnUAmSD;rr|^$y~s`M>4M=?*g%N(9bn; zjNs;;wq|%Qb`df&aD7!cv_$Mu@PrLdZ_mzHpR3NUrikTYH?dzSb}#!g#J-U#&Jp_o zjz2B|nrd&90Op61J#R%vU(D&~cH-?Zr@f~uR*`$(pna{#BXY_NIpx$r`#PmJBF{)N z)0kqHog0Zrz$D`{5_pBGx+Tk)@@dJsXjGMVi99Z+PL)%a4BCg3K5KN9Sr6088zt)r zs=QjV*Rj7&vNw&Y^1C9>NMxc!<_+3UD}DOtDzk5*$_FL;HmbT)a>DEnNzUR?RlXwf zyfluJ#)d)rRiz`NtIWBCDt|0Fdps%@op6{|@W3H|e-`<`|RIHUIcwWrb*u2hL|CFI3PoXGxywBe``x`%zH}&q*!FDgr1eq?*{`?;tuBI zLi0#BL{Y>PmU~0^wqdsg(RphNzMJ8x0YZ{BIg!yyPD-M4lAPGQ?ylXfi~u z6kt1)?vR4Z4RMhaykwR>CKEOqVw_AkA8~Wf@Pu|VnIjW=4Y5Wh3>adqOnBH3>t(_# zhB#X$+J@L96UQ6jtuhgJ*-#1=osa@I{{cB5vRf9sEDJ5<;RYR)cq_mkX0z8+Kp~ui zPoI~AFD*k^aj3>yvvGFHiq;UI5s>5MgB7;BBojKyYkoy^!s_KRf3 z9y4){%(xAN{hZ8r)@##gJw4lvoBPFjNv6Fj(*v;SdL86@Y%;9IrZVIOHeD`d)l_n$ zlu@f)FJ5|GPJl51U^>mxp zqd?|dvHn+_T5(pun0Y!_J8X>0Yiy~4lluahmUlF}`;?S}ZY)b@HpP#MCP zSRnH*v2KyVDN?u)gF`x4GHfyUjDp$&M!}6zdy^~W+XwP6{VN z&=Wc+GJ+b-8=3nbZm=gJMYRtYiHD^Y1vPX`D=Un+m&Hm*;ZiBw0&&08!B&r56|P+` z7%4xH+9O^mn~aoq#5yR2tx|X;q`a$xt2|ORxl-OTQeKtXqpp-SiGh8q)ntCh1neTQ zZk56tr0@<5rs&{MBYc^;&g}oQ%)}ua@@3rG(W>SW=d_-dzNiyziMNcc#_VdbJ}2W} zmGN)GiW+y2@A=aBz_ptE&qUhy1?@rIP%nk1(hP2Zv*9-q!0~VKr^Jb~%HJx`4`4WTyA#oVlvWaa@(##M&+Sy^?=9 zRN_iW4z8t2-){(hRj!blXs$hts!%*o6_c5-@UYmMB*-OgGI+{s);%^QF1lF z$Y8NCG9f|7V_P+%VJvz^tShCUS_&4yB0QUugOg#A`=M<(O)`V$8%c*HXzm94E(z{6 ze%~WO#2Nv(Pl9@3rikSEMkEB^Uj+-9{6C4cR|nbU@T?!5l1_G0G@NMp|gSW`dJ5m>P_cL~QLT}&N?*ySd;D~jN6g(*f zFJe%kgI}k}1$Wlep?Y#{?{{Lz6;=~XuJPlrE>5+9a;dw75eZC|Iy{*`Op&@b3{fog z;|(!g>T%f)Rm&V^;zl*i&r49QLO7^!ep6HjltPE*qp*d1}Am7G}JjkEkTxz zzsBj@T<~n|>e(*TL#zRr@PJHs0s(nI2R};@kTf|94~g?;t^OvX`hKa$ zHHBo|F7-zZai=tt8sd;Nz&tG7D-BUYd|et$^}~#YyUomDX+Y6}=OJmp_MyzqGC@fy zHfeoRto<@ETPBvki??*JE{zwp$$DVv`ExgN*6~|flo>U-OnDy1CNH&?)U#R}R~}y* z-Wplp4F~QiQ|($PYO@*R7EAt%3b_^)GAoB^%8JUYiJtHVldtHeK(emIkF+wWKqi$9 z2C}ZxK{!olQyl6!D$QFTvygHqzD8zsF~M1v$t-i>Wqn>|y=-Q#klD7!rm%Ys@a-^k znzJ4i>z`!O7Mauw+rFcNFQ%|9eQe#+9N*O&bJCq=o=qIz;j_t;X|8cxFGCh-#Bnzm zY4A7KJ{eJ-U1Xg7h0I3j<42>~`SU)qXmLnp<7&g(`I6=9*RNfV%dn&S!j`U%s1wD{ zx2^Gxo^IS&+2gF8l9w%csO;=qm!3zVx0w?bkl8pZLnov5thMVmuH>1>F0uL~w@q>{ z1wGBBuRv(rr;y8OoY?_p6fo2xP5v=_ft1lAK0X$UJGY7fQ(S+VzR$YS$KP zhvYsbx&HxK%`W|_M^=(EDQkhTYmJ0X_R89@an+hNCSE(N3nlk8$^9#2U6`cvvOKbq zoJm>cH8Zh1SR7JNmj;b;nr(|7LBL z?0fJp=)*4kUDQtaX&R9)VOWZtb38jy&t2U5n6*W+zmI=GKkm}6aqBDCaxg;M0P9#p z=8gBxG-3kfo@B9(kqivw?L8O9_*jLlIhM$4vixaT{!!K>Zf$Sr z8wmF-`NNI}`wuMr*1YGRK6>t7HYXB8e+5ha{xc8`?LO`4=nY?6y)Lw3!GC>n{_hfr z2K`&uhS;YE!mFc;-SF69C-HGEcq{RHCZy?-xOU2yt2LC;`;_zLaKmOLa zpYEd3EM%4_)+~1M40;aL%%w zl|T1ba@vlzwiqIEZ_oaRI`98u&Y_|MFXf+e6GW@}iKXvqVw{)%O>D%5CKdq&|qZQ0gJh=OgnQsK&e)!9`UT`G({C6XXK-L!E WvBZA68uFF{X91Tc0)avEi2Xm%OgDD` literal 26551 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 RPk?R&JsnF+d&FFZ{{uW&S1AAh diff --git a/main.ml b/main.ml index c446b9b..cbf17ab 100644 --- a/main.ml +++ b/main.ml @@ -3,6 +3,7 @@ let debug = false ;; let fatal_time = 1.0 ;; +let explosion_time = 1.5 ;; (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) @@ -73,28 +74,30 @@ type game_data = { mutable boosts : boost array ; } -type danger = Safe | Danger | Fatal | Blocked ;; +type danger = Safe | Danger of float | Fatal of float | Blocked ;; let int_of_danger = function | Safe -> 0 - | Danger -> 1 - | Fatal -> 2 + | Danger _ -> 1 + | Fatal _ -> 2 | Blocked -> 3 ;; -let danger_of_int = function +let danger_of_int t = function | 0 -> Safe - | 1 -> Danger - | 2 -> Fatal + | 1 -> Danger t + | 2 -> Fatal t | _ -> Blocked ;; type moveType = EscapeDeath | BlowUpCrates | KillPlayers | ClaimLand ;; exception ReturnInt of int ;; +exception ReturnBool of bool ;; (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) let current_status = ref BlowUpCrates ;; +let action = ref 0 ;; let equal_pt (p1 : pt) (p2 : pt) = p1.x = p2.x && p1.y = p2.y ;; @@ -115,6 +118,10 @@ let print_direction = function | 4 -> Printf.printf "STILL " | _-> failwith "ERROR : invalid direction" ;; +let level_of_danger = function + | Danger k | Fatal k -> k + | _ -> 32768. ;; + (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) @@ -150,8 +157,8 @@ let print_danger_levels (map : danger array array) = match map.(l).(c) with | Blocked -> Printf.printf "@ " | Safe -> Printf.printf ". " - | Danger -> Printf.printf "! " - | Fatal -> Printf.printf "X " + | Danger _ -> Printf.printf "! " + | Fatal _ -> Printf.printf "X " done; Printf.printf "\n" done ;; @@ -251,11 +258,11 @@ let parse_input (str : string) = (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) let warn_level (b : bomb) (ct : float) = match (b.det_time -. ct) with - | k when k < fatal_time -> Fatal ; - | _ -> Danger ;; + | k when k < fatal_time -> Fatal b.det_time ; + | _ -> Danger b.det_time ;; let danger_priority (p1 : danger) (p2 : danger) = - danger_of_int (max (int_of_danger p1) (int_of_danger p2)) ;; + danger_of_int (min (level_of_danger p1) (level_of_danger p2)) (max (int_of_danger p1) (int_of_danger p2)) ;; let order = [|(1, 0); (-1, 0); (0, 1); (0, -1)|] ;; let evaluate_dangers (gd : game_data) = @@ -271,35 +278,6 @@ let evaluate_dangers (gd : game_data) = done done ; - (* add players as warning (in case they bomb) *) - for p = 0 to gd.nplayers -1 do - if p <> gd.player_id then begin - let halt = ref false in - - let bx = gd.players.(p).xy.x - and by = gd.players.(p).xy.y in - - for dir = 0 to 3 do - for w = 0 to gd.players.(p).bomb_radius do - let cx = bx + w*(fst order.(dir)) - and cy = by + w*(snd order.(dir)) in - if not !halt && is_valid (cx) (cy) lines cols then begin - if gd.laby.(cx).(cy) = 1 then (* bedrock *) - halt := true ; - if gd.laby.(cx).(cy) = 2 then begin (* crate *) - halt := true ; - res.(cx).(cy) <- danger_priority res.(cx).(cy) Danger ; - end - else begin - res.(cx).(cy) <- danger_priority res.(cx).(cy) Danger ; - end - end - done; - halt := false ; - done - end - done; - (* sort bombs based on detonation time *) for b = 0 to gd.nbombs -1 do let m = ref gd.bombs.(b).det_time @@ -349,13 +327,14 @@ let evaluate_dangers (gd : game_data) = (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) let is_safe = function - | Safe | Danger -> true - | Fatal | Blocked -> false ;; + | Safe | Danger _ -> true + | Fatal _ | Blocked -> false ;; let move_safe (gd : game_data) (dgs : danger array array) = (* use this whenever you are standing on a non-safe tile *) - (* Strat : find the closest safe tile (or warning tile if there are no reachable safe tile) *) + (* Strat : find the shortest, safest path *) let pid = gd.player_id in + let interval = Float.pow 0.9 (float_of_int gd.players.(pid).nspeed) in let lines = Array.length gd.laby and cols = Array.length gd.laby.(0) in @@ -367,73 +346,44 @@ let move_safe (gd : game_data) (dgs : danger array array) = if dgs.(cx).(cy) = Safe then raise (ReturnInt 4) ; - let q = Queue.create () in let visited = Hashtbl.create 100 in - (* 1. try not to walk on fatal tiles *) - if debug then Printf.printf "[escape] Attempt 1/3...\n"; - if cx <> 0 && is_safe dgs.(cx-1).(cy) then (* North *) Queue.add (cx-1, cy, 0) q ; - if cx <> lines -1 && is_safe dgs.(cx+1).(cy) then (* South *) Queue.add (cx+1, cy, 2) q ; - if cy <> 0 && is_safe dgs.(cx).(cy-1) then (* West *) Queue.add (cx, cy-1, 3) q ; - if cy <> cols -1 && is_safe dgs.(cx).(cy+1) then (* East *) Queue.add (cx, cy+1, 1) q ; + let has_a_safe_path (cx0 : int) (cy0 : int) (simt : float) (vid : int) = + let q = Queue.create () in + Queue.add (cx0, cy0, simt) q ; (* everything added to q has valid coords *) + if debug then Printf.printf "[escape] Attempt %d/4...\n" vid ; + try + while not (Queue.is_empty q) do + let (cx, cy, cur_t) = Queue.pop q in + if Hashtbl.find_opt visited (cx, cy, vid) <> None then () else begin + Hashtbl.add visited (cx, cy, vid) 1 ; + if dgs.(cx).(cy) = Safe then + raise (ReturnBool true) + else if dgs.(cx).(cy) = Blocked then + () + else begin (* either danger or fatal *) + let dang_time = level_of_danger dgs.(cx).(cy) in + for dir = 0 to 3 do + let newx = cx + fst order.(dir) + and newy = cy + snd order.(dir) + and newt = cur_t +. interval in + if (is_valid newx newy lines cols) && not (newt > dang_time && newt < dang_time +. explosion_time) then + Queue.add (newx, newy, newt) q + done + end + end + done; + false + with + | ReturnBool b -> b + in - while not (Queue.is_empty q) do - let (cx, cy, dir) = Queue.pop q in - Hashtbl.add visited (cx, cy, 1) 1 ; - if dgs.(cx).(cy) = Safe then - raise (ReturnInt dir) - else begin - (* add neighbors *) - if cx <> 0 && Hashtbl.find_opt visited (cx-1, cy, 1) = None && is_safe dgs.(cx-1).(cy) then (* North *) Queue.add (cx-1, cy, dir) q ; - if cx <> lines -1 && Hashtbl.find_opt visited (cx+1, cy, 1) = None && is_safe dgs.(cx+1).(cy) then (* South *) Queue.add (cx+1, cy, dir) q ; - if cy <> 0 && Hashtbl.find_opt visited (cx, cy-1, 1) = None && is_safe dgs.(cx).(cy-1) then (* West *) Queue.add (cx, cy-1, dir) q ; - if cy <> cols -1 && Hashtbl.find_opt visited (cx, cy+1, 1) = None && is_safe dgs.(cx).(cy+1) then (* East *) Queue.add (cx, cy+1, dir) q ; - end - done; + if is_valid (cx+1) (cy) lines cols && has_a_safe_path (cx+1) (cy) gd.dt 0 then raise (ReturnInt 2) ; (* South *) + if is_valid (cx-1) (cy) lines cols && has_a_safe_path (cx-1) (cy) gd.dt 1 then raise (ReturnInt 0) ; (* North *) + if is_valid (cx) (cy+1) lines cols && has_a_safe_path (cx) (cy+1) gd.dt 2 then raise (ReturnInt 1) ; (* East *) + if is_valid (cx) (cy-1) lines cols && has_a_safe_path (cx) (cy-1) gd.dt 3 then raise (ReturnInt 3) ; (* West *) - (* 2. find the path that get you off fatal tiles ASAP *) - if debug then Printf.printf "[escape] Attempt 2/3...\n"; - if cx <> 0 && dgs.(cx-1).(cy) <> Blocked then (* North *) Queue.add (cx-1, cy, 0) q ; - if cx <> lines -1 && dgs.(cx+1).(cy) <> Blocked then (* South *) Queue.add (cx+1, cy, 2) q ; - if cy <> 0 && dgs.(cx).(cy-1) <> Blocked then (* West *) Queue.add (cx, cy-1, 3) q ; - if cy <> cols -1 && dgs.(cx).(cy+1) <> Blocked then (* East *) Queue.add (cx, cy+1, 1) q ; - - while not (Queue.is_empty q) do - let (cx, cy, dir) = Queue.pop q in - Hashtbl.add visited (cx, cy, 2) 1 ; - if dgs.(cx).(cy) = Safe then - raise (ReturnInt dir) - else begin - (* add neighbors *) - if cx <> 0 && Hashtbl.find_opt visited (cx-1, cy, 2) = None && dgs.(cx-1).(cy) <> Blocked then (* North *) Queue.add (cx-1, cy, dir) q ; - if cx <> lines -1 && Hashtbl.find_opt visited (cx+1, cy, 2) = None && dgs.(cx+1).(cy) <> Blocked then (* South *) Queue.add (cx+1, cy, dir) q ; - if cy <> 0 && Hashtbl.find_opt visited (cx, cy-1, 2) = None && dgs.(cx-1).(cy) <> Blocked then (* West *) Queue.add (cx, cy-1, dir) q ; - if cy <> cols -1 && Hashtbl.find_opt visited (cx, cy+1, 2) = None && dgs.(cx).(cy+1) <> Blocked then (* East *) Queue.add (cx, cy+1, dir) q ; - end - done; - - (* 3. no safe tile within reach (very rare), look out for warning *) - if debug then Printf.printf "[escape] Attempt 3/3...\n"; - if cx <> 0 && dgs.(cx-1).(cy) <> Blocked then (* North *) Queue.add (cx-1, cy, 0) q ; - if cx <> lines -1 && dgs.(cx+1).(cy) <> Blocked then (* South *) Queue.add (cx+1, cy, 2) q ; - if cy <> 0 && dgs.(cx).(cy-1) <> Blocked then (* West *) Queue.add (cx, cy-1, 3) q ; - if cy <> cols -1 && dgs.(cx).(cy+1) <> Blocked then (* East *) Queue.add (cx, cy+1, 1) q ; - - while not (Queue.is_empty q) do - let (cx, cy, dir) = Queue.pop q in - Hashtbl.add visited (cx, cy, 3) 1 ; - if dgs.(cx).(cy) = Danger then - raise (ReturnInt dir) - else begin - (* add neighbors *) - if cx <> 0 && Hashtbl.find_opt visited (cx-1, cy, 3) = None && dgs.(cx-1).(cy) <> Blocked then (* North *) Queue.add (cx-1, cy, dir) q ; - if cx <> lines -1 && Hashtbl.find_opt visited (cx+1, cy, 3) = None && dgs.(cx+1).(cy) <> Blocked then (* South *) Queue.add (cx+1, cy, dir) q ; - if cy <> 0 && Hashtbl.find_opt visited (cx, cy-1, 3) = None && dgs.(cx-1).(cy) <> Blocked then (* West *) Queue.add (cx, cy-1, dir) q ; - if cy <> cols -1 && Hashtbl.find_opt visited (cx, cy+1, 3) = None && dgs.(cx).(cy+1) <> Blocked then (* East *) Queue.add (cx, cy+1, dir) q ; - end - done; - - (* you're probably dead if the code reaches here *) + (* you're probably dead if the code reaches here... *) if debug then Printf.printf "[escape] Attempt F...\n"; 4 with @@ -445,67 +395,83 @@ let move_safe (gd : game_data) (dgs : danger array array) = let move_explore (gd: game_data) (dgs : danger array array) = (* destroy crates *) let pid = gd.player_id in + let interval = Float.pow 0.9 (float_of_int gd.players.(pid).nspeed) in let lines = Array.length gd.laby and cols = Array.length gd.laby.(0) in (* find nearest crate and blow it up *) try - let q = Queue.create () in + let (cx, cy) = (gd.players.(pid).xy.x, gd.players.(pid).xy.y) in + let visited = Hashtbl.create 100 in - let (cx, cy) = (gd.players.(pid).xy.x, gd.players.(pid).xy.y) in - (* O. if there's a crate right next to you, blow it up *) - if cx <> 0 && gd.laby.(cx-1).(cy) = 2 then (* North *) begin current_status := EscapeDeath; raise (ReturnInt 4) end ; - if cx <> lines -1 && gd.laby.(cx+1).(cy) = 2 then (* South *) begin current_status := EscapeDeath; raise (ReturnInt 4) end ; - if cy <> 0 && gd.laby.(cx).(cy-1) = 2 then (* West *) begin current_status := EscapeDeath; raise (ReturnInt 4) end ; - if cy <> cols -1 && gd.laby.(cx).(cy+1) = 2 then (* East *) begin current_status := EscapeDeath; raise (ReturnInt 4) end ; + let has_a_safe_path (cx0 : int) (cy0 : int) (simt : float) (vid : int) = + let q = Queue.create () in + Queue.add (cx0, cy0, simt) q ; (* everything added to q has valid coords *) + if debug then Printf.printf "[crates] Attempt %d/4...\n" vid ; + try + while not (Queue.is_empty q) do + let (cx, cy, cur_t) = Queue.pop q in + if Hashtbl.find_opt visited (cx, cy, vid) <> None then () else begin + Hashtbl.add visited (cx, cy, vid) 1 ; + if dgs.(cx).(cy) = Safe then + raise (ReturnBool true) + else if gd.laby.(cx).(cy) = 2 then (* crate *) + raise (ReturnBool true) + else if dgs.(cx).(cy) = Blocked then + () + else begin (* either danger or fatal *) + let dang_time = level_of_danger dgs.(cx).(cy) in + for dir = 0 to 3 do + let newx = cx + fst order.(dir) + and newy = cy + snd order.(dir) + and newt = cur_t +. interval in + if (is_valid newx newy lines cols) && not (newt > dang_time && newt < dang_time +. explosion_time) then + Queue.add (newx, newy, newt) q + done + end + end + done; + false + with + | ReturnBool b -> b + in - (* 1. search without walking on dangerous tiles *) - if debug then Printf.printf "[explore] Attempt 1/2...\n"; - if cx <> 0 && is_safe dgs.(cx-1).(cy) then (* North *) Queue.add (cx-1, cy, 0) q ; - if cx <> lines -1 && is_safe dgs.(cx+1).(cy) then (* South *) Queue.add (cx+1, cy, 2) q ; - if cy <> 0 && is_safe dgs.(cx).(cy-1) then (* West *) Queue.add (cx, cy-1, 3) q ; - if cy <> cols -1 && is_safe dgs.(cx).(cy+1) then (* East *) Queue.add (cx, cy+1, 1) q ; + (* check if there's a crate next to the player *) + if is_valid (cx+1) (cy) lines cols && gd.laby.(cx+1).(cy) = 2 then begin (* Crate at South *) + current_status := EscapeDeath ; + action := 1; + if debug then Printf.printf "Fire in the hole!\n" ; + raise (ReturnInt 4) ; + end; + if is_valid (cx-1) (cy) lines cols && gd.laby.(cx-1).(cy) = 2 then begin (* Crate at North *) + current_status := EscapeDeath ; + action := 1; + if debug then Printf.printf "Fire in the hole!\n" ; + raise (ReturnInt 4) ; + end; + if is_valid (cx) (cy+1) lines cols && gd.laby.(cx).(cy+1) = 2 then begin (* Crate at East *) + current_status := EscapeDeath ; + action := 1; + if debug then Printf.printf "Fire in the hole!\n" ; + raise (ReturnInt 4) ; + end; + if is_valid (cx) (cy-1) lines cols && gd.laby.(cx).(cy-1) = 2 then begin (* Crate at West *) + current_status := EscapeDeath ; + action := 1; + if debug then Printf.printf "Fire in the hole!\n" ; + raise (ReturnInt 4) ; + end; - while not (Queue.is_empty q) do - let (cx, cy, dir) = Queue.pop q in - Hashtbl.add visited (cx, cy, 1) 1 ; - if gd.laby.(cx).(cy) = 2 then - raise (ReturnInt dir) - else begin - (* add neighbors *) - if cx <> 0 && Hashtbl.find_opt visited (cx-1, cy, 1) = None && is_safe dgs.(cx-1).(cy) then (* North *) Queue.add (cx-1, cy, dir) q ; - if cx <> lines -1 && Hashtbl.find_opt visited (cx+1, cy, 1) = None && is_safe dgs.(cx+1).(cy) then (* South *) Queue.add (cx+1, cy, dir) q ; - if cy <> 0 && Hashtbl.find_opt visited (cx, cy-1, 1) = None && is_safe dgs.(cx).(cy-1) then (* West *) Queue.add (cx, cy-1, dir) q ; - if cy <> cols -1 && Hashtbl.find_opt visited (cx, cy+1, 1) = None && is_safe dgs.(cx).(cy+1) then (* East *) Queue.add (cx, cy+1, dir) q ; - end - done; - - (* 2. search one anyway *) - if debug then Printf.printf "[explore] Attempt 2/2...\n"; - let (cx, cy) = (gd.players.(pid).xy.x, gd.players.(pid).xy.y) in - if cx <> 0 && is_safe dgs.(cx-1).(cy) then (* North *) Queue.add (cx-1, cy, 0) q ; - if cx <> lines -1 && is_safe dgs.(cx+1).(cy) then (* South *) Queue.add (cx+1, cy, 2) q ; - if cy <> 0 && is_safe dgs.(cx).(cy-1) then (* West *) Queue.add (cx, cy-1, 3) q ; - if cy <> cols -1 && is_safe dgs.(cx).(cy+1) then (* East *) Queue.add (cx, cy+1, 1) q ; - - while not (Queue.is_empty q) do - let (cx, cy, dir) = Queue.pop q in - Hashtbl.add visited (cx, cy, 2) 1 ; - if gd.laby.(cx).(cy) = 2 then - raise (ReturnInt dir) - else begin - (* add neighbors *) - if cx <> 0 && Hashtbl.find_opt visited (cx-1, cy, 2) = None && dgs.(cx-1).(cy) <> Blocked then (* North *) Queue.add (cx-1, cy, dir) q ; - if cx <> lines -1 && Hashtbl.find_opt visited (cx+1, cy, 2) = None && dgs.(cx+1).(cy) <> Blocked then (* South *) Queue.add (cx+1, cy, dir) q ; - if cy <> 0 && Hashtbl.find_opt visited (cx, cy-1, 2) = None && dgs.(cx).(cy-1) <> Blocked then (* West *) Queue.add (cx, cy-1, dir) q ; - if cy <> cols -1 && Hashtbl.find_opt visited (cx, cy+1, 2) = None && dgs.(cx).(cy+1) <> Blocked then (* East *) Queue.add (cx, cy+1, dir) q ; - end - done; + (* go to one without stepping into a dangerous tile *) + if is_valid (cx+1) (cy) lines cols && has_a_safe_path (cx+1) (cy) gd.dt 0 then raise (ReturnInt 2) ; (* South *) + if is_valid (cx-1) (cy) lines cols && has_a_safe_path (cx-1) (cy) gd.dt 1 then raise (ReturnInt 0) ; (* North *) + if is_valid (cx) (cy+1) lines cols && has_a_safe_path (cx) (cy+1) gd.dt 2 then raise (ReturnInt 1) ; (* East *) + if is_valid (cx) (cy-1) lines cols && has_a_safe_path (cx) (cy-1) gd.dt 3 then raise (ReturnInt 3) ; (* West *) (* no crates ? Go for kills *) - if debug then Printf.printf "[explore] Attempt F...\n"; + if debug then Printf.printf "[crates] Attempt F...\n"; 4 with | ReturnInt k -> k ;; @@ -519,5 +485,5 @@ print_game_data game_d ;; print_danger_levels dangers ;; Printf.printf "move at ";; -print_direction (move_safe game_d dangers) ;; +print_direction (move_explore game_d dangers) ;; Printf.printf "\n" ;; \ No newline at end of file diff --git a/tp.txt b/tp.txt index adbdfa7..b73a0da 100644 --- a/tp.txt +++ b/tp.txt @@ -12,4 +12,12 @@ 0 1 2 1 2 1 2 1 2 1 2 3 3 3 0 0 0 2 2 4 4 0 0 1 0 1 0 1 0 1 0 1 0 -0 0 0 2 2 2 2 3 3 2 0 \ No newline at end of file +0 0 0 2 2 2 2 3 3 2 0 + +0 0 2 2 2 2 2 2 2 0 0 +0 1 2 1 2 1 2 1 2 1 0 +2 2 2 2 2 2 2 0 2 2 2 +2 1 0 1 2 1 2 1 2 1 0 +2 2 2 2 2 2 2 2 2 2 2 +0 1 2 1 2 1 2 1 0 1 0 +0 0 2 2 2 2 2 2 2 0 0 \ No newline at end of file