From 1ed4d9b75b90e84c6293ca51097dc0ac2a0421cb Mon Sep 17 00:00:00 2001 From: Alexandre Date: Wed, 6 Nov 2024 22:25:29 +0100 Subject: [PATCH] added 1st movement algorithm --- bin/main | Bin 184393 -> 222033 bytes input_test.txt | 10 +-- main.cmi | Bin 4065 -> 5677 bytes main.cmo | Bin 11964 -> 20192 bytes main.ml | 235 +++++++++++++++++++++++++++++++++++++++++-------- tp.txt | 15 ++++ 6 files changed, 216 insertions(+), 44 deletions(-) create mode 100644 tp.txt diff --git a/bin/main b/bin/main index a2cd4de507b1be7a9330edf981f16d1fc8285800..f5e98d685b9688914bede9a9f3757ca7389fb9bc 100755 GIT binary patch delta 35512 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 diff --git a/input_test.txt b/input_test.txt index 9f6219b..7d9cfdd 100644 --- a/input_test.txt +++ b/input_test.txt @@ -1,19 +1,19 @@ 3.7 -3 +0 7 11 0 0 0 0 0 0 0 0 0 0 0 -0 1 0 1 2 1 2 1 2 1 0 +0 0 0 0 2 0 2 0 2 0 0 0 0 0 2 2 2 2 2 0 0 0 -0 1 2 1 2 1 2 1 2 1 2 +0 0 2 0 2 0 2 0 2 0 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 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 3 3 2 0 3 3 2 4 4.1 4 4 2 4.3 0 0 3 5.5 5 -0 0 0 3 2 4 5 3 +2 2 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 65809bd7ccbe24c3e95e21610ec3bc1e260f2317..dee3dc1ac32c406b20e6ed99ac0927ae44ab9c6f 100644 GIT binary patch literal 5677 zcmZu#33L=i8m_;O9Izg&5nSI}B_XF=gTRvj?oLPuBwQgO;bzjwbi$Cim;;EefFgn- zI3Nm&XlJ8FKp`5CLxcug5m^j~$}NW?%Au$na>@Qx-EFn5@6Etho%)Wys=B&*auuJq zOLlg4fupPA@#kLOL`YH=A>uVcZkvhU&RXgq#pBl+wKTU{5v>OCz;3-MR-alC2zdKC zV@^T7c$_%NOlPB>;lrMteBL~O2LO8Ml3*aG(^)6Aayn7uzA7c6cwG^XPX+NHQ%bAy z29!u1mwE!Fq}%%f3Sv(CRH!T;1Ez*O52<7XV>vkMDP$E71>pz?M|G*hKxZhcq93v{-D-r5Fd501MV$F0 zGRGBza2AB`b;-q$NGQ|a-&S445D>QEN0%x~Km-s4qq#D0NIf}aK2oL)2QeAMcDgj(KpiOMnE^;i z_lJY3>Lz2Em51|U$eS|)#Eu|#)}^Nn^dRLe8Hl_NemW&CB@*ygs$?8vM>+c$WG@;C z;y*xi>e6BZ4WsOaLC9{;$RWk;iH3=bkssycc}T7w1!5_P!*%IZ15Kdhrol)~^ShPs zcv8-2b2)7;(pHTIu?9q+E;SnHAxhgkgjE^|DZwyN81Dtndm4G~jREmt5FgQ{jRu-S zc{_`2leihCzqpEu(J7iZNv>PDdqivy2-!>se$SRzO@1;+wj3#6asP>uiZF<1rVA&)`Rwj^pjJ z9>fhs#`8llW24s5tyU>fZ^RW0;EfI9QQR=32JZ44y%o>8LEH$Uu1n_(w2RtYA4UZ_ zSOUiVc#Lj1(k3qOJQcX&0r5K!&*{=t16@G@84^pWLMKbXTJy)5#!{}a2sLDg3xL!E zq}~YQ4OqxjT9^H<5OdH^Fp)uAWHA%DqZXtcAnihtBm*8~BJGA#k&I|q^{U}8h+iSS zF18@OB;xjZD%yqADh&(65M0ouR(z_tlL;cFbePCZ;C7i1OW zYQ*Ixp2a)@W7s`L7e<))jf4f9T~FCHBoE}-AU}oJYhsPDA0CTryoD$^K*>@n#*!Z6 z0(Bhzn`%8w`hr{say{aInV3FTWSBD!wKDz2c!f#O$f9z-M)|WyKFB)ATM^GTv9UT9 zxsab>(I>JrPMT&umw1`OSE$+|(huZAARj@z*u*zjnucIWe2I!RkphUj3*zoZyxPP)nAo-ozE{Yw zmN-Ga7eCl<9VvvkY>4a0_6r%dk2Ic4ZpB|spG+ssHC%^jQcIL7l|*Co!7amwWFW-# zhPXn++f6)}xqacL(es!BnPhfvHoFYL?z>GqoOM5{V)wLsdY&PZ&EEUX9wV^#0Ta7e z?{BNHcSav?pt1&^UQ^8e$IU+F*#CryJ*@wa)%Ma)nt$spN%S%`aZxgjN@hJie4vhFo| z_D5D*6PGboXD_na5Ab-sMeIz2q{mEBrrB{glCn(9wkM&74@p_MUd7`ZsQBGLW|)*N zW;Ycn_nSD#d~*D@=@hz~f9qgPr;s-Rr*o^8Rjfv$A%6jV*nNkC(U#zuR-NMS=ZxV^ z6qAKiKFq67u~AQV`2&6x*BH4e33O!$Wr03)-ZIsRQ9NnWqw;BE%4Fd-&TeGuL>7|x zrMJ=H|IYRASd-agfz@nQT||L|osiIsrIwp`A1gHwr1q)d$x0B!Gv<2aJNR#J3~RXa zyT+pZNsZSO9dEoa>VTP(2E0^3+9jd&oj z8WL+TRGo>#Yycal&`_O&A$o7SJt4I+;tBZifMR8v#e;nCX9Myd%jrYrw3>J!aTO#s zq0<@@Z)Hv&JYsXQodCW!XHAA@xz+YRv--%g+QF=Lkjc<;AGAD#Rv(-AG_yJ|m0EQ* zi!!zpuR2Nf;&JAO-|S|xRSr+mC&oE${V|6-Is7knx`#J+Sy4V=QN9KegWE5`?N>3& zNwd-F78d3L=}XgeG&j$11cw^mY|ooH>eG!YL%4V|E&dO0m%A;)JsBL)8j3AR0UK#*=%-t$W%;9NDYfBVpR)CaH~aVe+Fo|;PtJV8b>8VS4nN1d(i$8_ z8E*2cUvRk33cue12P|-qmLp~WsfVPEkfdWH(`q!cavmUqX*unKN+_)2V<8yDUFIjN zlw9s|2&ZT=ZyvTRjxdXCAnTy@577E&wCHIyeq|N~`0|Pt_f1wpeivIPApUGP$bxNR zzBC6*{3o|LO3NO{+s7>1;}$r<{EL8GgX9cIZjb&$twwj|Urr{l88aTNE?l>PkS9_L z;srAVc)7t>EQAab`K7OEh6rz;w5-3ez$uoY3dl`JZh+(!n4#Kg;A;@Bnn}b@Go%GV zZhEGto>UpvDLrveC&ayO*hgND#Y_Cj(*K$1F9&!KGPgtKPSjsv zH9lqf8-UEB23hp@VOsoRR(XjlUa)S)8dj(fV1@4G9WHWcqg|#GRL}qPixupO1+KD$ z9|Pn-*54rO@0f6>)ktRv4+5D@6Q&zGGl*Ak0pObdil`gjMa!RldC|MI-SOk zhj=n4BnQ72@w-hkem#siZccBtvc>z0m)@B@aK{7t&%LN=9gUY)m#egLyb_8z0@>%I zYr+eAuD`$eqwAw@jMcPGR*w?4KgS%MX7u^U{oJa;qE7kUz8cx}oTjz^t&2J_<|uUc zfa#yPd^7)YqVVnbn!9W!L!)X`jX7#wN$xU6Khz?5?edyW*N>iRGby5v+p3u3*5H!D z%cb)gM=UwBe#Y!i=4o1I%cMX4j1#Hw#vH%YDNnVyae2+%Q?HNM`_^kMZASU@$IO@` zuVMeyKu%8WO89)v+{aJVXj%tLC6|?}oXj}2Van!(MOzn^DLqqH_~zQZ%Wioi@x#qMG|l`;Am-?pkY2TE z+SU#8{h_Yek@-h8tw%2Y(u*~!A;03y4}^S5q>mEzREA@Y57x|R$T*vMapRKu35VUy T+s(No63(H3UzvV2JmmflN0r9I literal 4065 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 diff --git a/main.ml b/main.ml index 4ad2e2c..234bc4a 100644 --- a/main.ml +++ b/main.ml @@ -1,16 +1,26 @@ -let debug = false ;; +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) -type bomb = { +let debug = false ;; +let fatal_time = 1.0 ;; + +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) + +type pt = { x : int ; y : int ; +} + +type bomb = { + xy : pt ; size : int ; det_time : float ; } type player = { id : int ; - x : int ; - y : int ; + xy : pt ; nspeed : int ; nbomb_atonce : int ; bomb_radius : int ; @@ -19,22 +29,24 @@ type player = { } type boost = { - x : int ; - y : int ; + xy : pt ; spec : int ; } -let default_bomb = { +let default_point = { x = 0 ; y = 0 ; +} + +let default_bomb = { + xy = default_point ; size = 0 ; det_time = 0. ; } and default_player = { id = 0 ; - x = 0 ; - y = 0 ; + xy = default_point ; nspeed = 0 ; nbomb_atonce = 0 ; bomb_radius = 0 ; @@ -43,8 +55,7 @@ and default_player = { } and default_boost = { - x = 0 ; - y = 0 ; + xy = default_point ; spec = 0 ; } @@ -62,22 +73,46 @@ type game_data = { mutable boosts : boost array ; } -type danger = Powerup | Safe | Danger | Fatal | Blocked ;; +type danger = Safe | Danger | Fatal | Blocked ;; let int_of_danger = function | Safe -> 0 | Danger -> 1 - | Powerup -> 2 - | Fatal -> 3 - | Blocked -> 4 ;; + | Fatal -> 2 + | Blocked -> 3 ;; let danger_of_int = function | 0 -> Safe | 1 -> Danger - | 2 -> Powerup - | 3 -> Fatal + | 2 -> Fatal | _ -> Blocked ;; +type moveType = EscapeDeath | BlowUpCrates | KillPlayers | ClaimLand ;; + +exception ReturnInt of int ;; + +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) + +let equal_pt (p1 : pt) (p2 : pt) = + p1.x = p2.x && p1.y = p2.y ;; + +let swap arr i j = + let temp = arr.(i) in + arr.(i) <- arr.(j) ; + arr.(j) <- temp ;; + +let is_valid i j len hei = + i >= 0 && j >= 0 && i < len && j < hei ;; + +let print_direction = function + | 0 -> Printf.printf "NORTH " + | 1 -> Printf.printf "EAST " + | 2 -> Printf.printf "SOUTH " + | 3 -> Printf.printf "WEST " + | 4 -> Printf.printf "STILL " + | _-> failwith "ERROR : invalid direction" ;; + (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) @@ -95,15 +130,15 @@ let print_game_data (gd : game_data) = done ; Printf.printf "Bombs (%d) : \n" gd.nbombs ; for b = 0 to gd.nbombs -1 do - Printf.printf " [Bomb] (at %d %d) (of size %d) (blowing up at %f)\n" gd.bombs.(b).x gd.bombs.(b).y gd.bombs.(b).size gd.bombs.(b).det_time ; + Printf.printf " [Bomb] (at %d %d) (of size %d) (blowing up at %f)\n" gd.bombs.(b).xy.x gd.bombs.(b).xy.y gd.bombs.(b).size gd.bombs.(b).det_time ; done; Printf.printf "Players (%d) : \n" gd.nplayers ; for b = 0 to gd.nplayers -1 do - Printf.printf " [Player %d] (at %d %d) (holding %d %d %d %d %d)\n" gd.players.(b).id gd.players.(b).x gd.players.(b).y gd.players.(b).nspeed gd.players.(b).nbomb_atonce gd.players.(b).bomb_radius gd.players.(b).ndash gd.players.(b).ntraps ; + Printf.printf " [Player %d] (at %d %d) (holding %d %d %d %d %d)\n" gd.players.(b).id gd.players.(b).xy.x gd.players.(b).xy.y gd.players.(b).nspeed gd.players.(b).nbomb_atonce gd.players.(b).bomb_radius gd.players.(b).ndash gd.players.(b).ntraps ; done; Printf.printf "Boosts (%d) : \n" gd.nboosts ; for b = 0 to gd.nboosts -1 do - Printf.printf " [Boost] (at %d %d) (of type %d)\n" gd.boosts.(b).x gd.boosts.(b).y gd.boosts.(b).spec ; + Printf.printf " [Boost] (at %d %d) (of type %d)\n" gd.boosts.(b).xy.x gd.boosts.(b).xy.y gd.boosts.(b).spec ; done;; let print_danger_levels (map : danger array array) = @@ -115,7 +150,6 @@ let print_danger_levels (map : danger array array) = | Safe -> Printf.printf ". " | Danger -> Printf.printf "! " | Fatal -> Printf.printf "X " - | Powerup -> Printf.printf "P " done; Printf.printf "\n" done ;; @@ -179,7 +213,7 @@ let parse_input (str : string) = and last = ref 0 in let dat = int_n_of_string psd 3 last in let dtime = Float.of_string (String.init (String.length psd - !last) (fun i -> psd.[i + !last])) in - res.bombs.(b) <- {x = dat.(0) ; y = dat.(1) ; size = dat.(2) ; det_time = dtime ; + res.bombs.(b) <- {xy = {x = dat.(0) ; y = dat.(1) ;} ; size = dat.(2) ; det_time = dtime ; } done; @@ -190,7 +224,7 @@ let parse_input (str : string) = res.players <- Array.make res.nplayers default_player ; for p = 0 to res.nplayers -1 do let dat = int_n_of_string (input_line ptr) 8 useless in - res.players.(p) <- {id = dat.(2) ; x = dat.(0) ; y = dat.(1) ; nspeed = dat.(3) ; nbomb_atonce = dat.(4) ; bomb_radius = dat.(5) ; ndash = dat.(6) ; ntraps = dat.(7) ;} + res.players.(p) <- {id = dat.(2) ; xy = {x = dat.(0) ; y = dat.(1) ;} ; nspeed = dat.(3) ; nbomb_atonce = dat.(4) ; bomb_radius = dat.(5) ; ndash = dat.(6) ; ntraps = dat.(7) ;} done; (* boosts *) @@ -200,7 +234,7 @@ let parse_input (str : string) = res.boosts <- Array.make res.nboosts default_boost ; for p = 0 to res.nboosts -1 do let dat = int_n_of_string (input_line ptr) 3 useless in - res.boosts.(p) <- {x = dat.(0) ; y = dat.(1) ; spec = dat.(2)} + res.boosts.(p) <- {xy = {x = dat.(0) ; y = dat.(1) ;} ; spec = dat.(2)} done; if debug then Printf.printf "Done!\n" ; @@ -211,13 +245,17 @@ let parse_input (str : string) = close_in ptr ; failwith "cannot happen unless something is wrong" ;; +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) + let warn_level (b : bomb) (ct : float) = match (b.det_time -. ct) with - | k when k < 1.0 -> Fatal ; + | k when k < fatal_time -> Fatal ; | _ -> Danger ;; let danger_priority (p1 : danger) (p2 : danger) = danger_of_int (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) = let lines = Array.length gd.laby and cols = Array.length gd.laby.(0) in @@ -226,31 +264,150 @@ let evaluate_dangers (gd : game_data) = (* add solid blocks *) for l = 0 to lines -1 do for c = 0 to cols -1 do - if gd.laby.(l).(c) = 1 || gd.laby.(l).(c) = 1 then + if gd.laby.(l).(c) = 1 || gd.laby.(l).(c) = 2 then res.(l).(c) <- Blocked ; done done ; - (* add bomb tiles *) + (* sort bombs based on detonation time *) for b = 0 to gd.nbombs -1 do - let dgr = warn_level gd.bombs.(b) gd.dt in - for off = -gd.bombs.(b).size to gd.bombs.(b).size do - let ln = min (lines -1) (max 0 (gd.bombs.(b).x + off)) - and cl = min (cols -1) (max 0 (gd.bombs.(b).y + off)) in - if res.(ln).(gd.bombs.(b).y) = Safe then - res.(ln).(gd.bombs.(b).y) <- danger_priority (res.(ln).(gd.bombs.(b).y)) dgr ; - if res.(gd.bombs.(b).x).(cl) = Safe then - res.(gd.bombs.(b).x).(cl) <- danger_priority (res.(gd.bombs.(b).x).(cl)) dgr ; + let m = ref gd.bombs.(b).det_time + and im = ref b in + for j = b+1 to gd.nbombs -1 do + if gd.bombs.(j).det_time < !m then begin + m := gd.bombs.(j).det_time ; + im := j ; + end done; + swap gd.bombs b (!im) ; done; - (* add powerups *) - for p = 0 to gd.nboosts -1 do - res.(gd.boosts.(p).x).(gd.boosts.(p).y) <- Powerup ; + (* add bomb tiles *) + let exploded = Hashtbl.create 12 in + for b = 0 to gd.nbombs -1 do + let dgr = warn_level gd.bombs.(b) gd.dt in + let halt = ref false in + + let bx = gd.bombs.(b).xy.x + and by = gd.bombs.(b).xy.y in + + for dir = 0 to 3 do + for w = 0 to gd.bombs.(b).size 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 && Hashtbl.find_opt exploded (cx, cy) = None then begin (* unexploded crate *) + halt := true ; + res.(cx).(cy) <- danger_priority res.(cx).(cy) dgr ; + Hashtbl.add exploded (cx, cy) 1 + end + else begin + res.(cx).(cy) <- danger_priority res.(cx).(cy) dgr ; + end + end + done; + halt := false ; + done done; res ;; +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) + +let is_safe = function + | 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 *) + let pid = gd.player_id in + + let lines = Array.length gd.laby + and cols = Array.length gd.laby.(0) in + + (* BFS to find the nearest safe spot (if it exists) *) + try + let q = Queue.create () in + let visited = Hashtbl.create 100 in + + (* 1. try not to walk on fatal tiles *) + if debug then Printf.printf "Attempt 1/3...\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, 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; + + (* 2. find the path that get you off fatal tiles ASAP *) + if debug then Printf.printf "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 "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 *) + if debug then Printf.printf "Attempt F...\n"; + 4 + with + | ReturnInt k -> k ;; + let game_d = parse_input "input_test.txt" ;; +let dangers = evaluate_dangers game_d ;; print_game_data game_d ;; -print_danger_levels (evaluate_dangers game_d) \ No newline at end of file +print_danger_levels dangers ;; + +Printf.printf "move at ";; +print_direction (move_safe game_d dangers) ;; +Printf.printf "\n" ;; \ No newline at end of file diff --git a/tp.txt b/tp.txt new file mode 100644 index 0000000..adbdfa7 --- /dev/null +++ b/tp.txt @@ -0,0 +1,15 @@ +0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 +3 3 3 0 0 0 0 0 4 4 0 +0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 3 3 0 0 + +0 0 0 0 0 0 0 0 0 0 0 +0 1 0 1 2 1 2 1 2 1 0 +0 0 0 2 2 2 2 2 0 0 0 +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