1 (***********************************************************************)
5 (* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)
7 (* Copyright 1996 Institut National de Recherche en Informatique et *)
8 (* en Automatique. All rights reserved. This file is distributed *)
9 (* under the terms of the Q Public License version 1.0. *)
11 (***********************************************************************)
16 type peg
= Out
| Empty
| Peg
19 [| Out
; Out
; Out
; Out
; Out
; Out
; Out
; Out
; Out
|];
20 [| Out
; Out
; Out
; Peg
; Peg
; Peg
; Out
; Out
; Out
|];
21 [| Out
; Out
; Out
; Peg
; Peg
; Peg
; Out
; Out
; Out
|];
22 [| Out
; Peg
; Peg
; Peg
; Peg
; Peg
; Peg
; Peg
; Out
|];
23 [| Out
; Peg
; Peg
; Peg
; Empty
; Peg
; Peg
; Peg
; Out
|];
24 [| Out
; Peg
; Peg
; Peg
; Peg
; Peg
; Peg
; Peg
; Out
|];
25 [| Out
; Out
; Out
; Peg
; Peg
; Peg
; Out
; Out
; Out
|];
26 [| Out
; Out
; Out
; Peg
; Peg
; Peg
; Out
; Out
; Out
|];
27 [| Out
; Out
; Out
; Out
; Out
; Out
; Out
; Out
; Out
|]
31 let print_peg = function
32 Out
-> print_string
"."
33 | Empty
-> print_string
" "
34 | Peg
-> print_string
"$"
37 let print_board board =
40 print_peg board.(i
).(j
)
46 type direction
= { dx
: int; dy
: int }
48 let dir = [| {dx
= 0; dy
= 1}; {dx
= 1; dy
= 0};
49 {dx
= 0; dy
= -1}; {dx
= -1; dy
= 0} |]
51 type move
= { x1
: int; y1
: int; x2
: int; y2
: int }
53 let moves = Array.create
31 {x1
=0;y1
=0;x2
=0;y2
=0}
60 counter := !counter + 1;
62 begin match board.(4).(4) with Peg
-> true | _
-> false end
65 if !counter mod 500 = 0 then begin
66 print_int
!counter; print_newline
()
70 match board.(i
).(j
) with
73 let d1 = dir.(k
).dx
in
74 let d2 = dir.(k
).dy
in
79 match board.(i1).(j1) with
81 begin match board.(i2).(j2) with
84 print_int i; print_string ", ";
85 print_int j; print_string ") dir ";
86 print_int k; print_string "\n";
88 board.(i
).(j
) <- Empty
;
89 board.(i1).(j1) <- Empty
;
90 board.(i2).(j2) <- Peg
;
91 if solve(m
+1) then begin
92 moves.(m
) <- { x1
=i
; y1
=j
; x2
=i2; y2
=j2 };
96 board.(i1).(j1) <- Peg
;
97 board.(i2).(j2) <- Empty
111 let _ = if solve 0 then (print_string
"\n"; print_board board)