@@ -17,33 +17,18 @@ type peg =
1717 | Empty
1818 | Peg
1919
20- let board =
21- [| [| Out ; Out ; Out ; Out ; Out ; Out ; Out ; Out ; Out |]
22- ; [| Out ; Out ; Out ; Peg ; Peg ; Peg ; Out ; Out ; Out |]
23- ; [| Out ; Out ; Out ; Peg ; Peg ; Peg ; Out ; Out ; Out |]
24- ; [| Out ; Peg ; Peg ; Peg ; Peg ; Peg ; Peg ; Peg ; Out |]
25- ; [| Out ; Peg ; Peg ; Peg ; Empty ; Peg ; Peg ; Peg ; Out |]
26- ; [| Out ; Peg ; Peg ; Peg ; Peg ; Peg ; Peg ; Peg ; Out |]
27- ; [| Out ; Out ; Out ; Peg ; Peg ; Peg ; Out ; Out ; Out |]
28- ; [| Out ; Out ; Out ; Peg ; Peg ; Peg ; Out ; Out ; Out |]
29- ; [| Out ; Out ; Out ; Out ; Out ; Out ; Out ; Out ; Out |]
30- |]
31-
32- (*
3320let print_peg = function
34- Out -> print_string "."
21+ | Out -> print_string " ."
3522 | Empty -> print_string " "
3623 | Peg -> print_string " $"
3724
38-
3925let print_board board =
40- for i=0 to 8 do
41- for j=0 to 8 do
42- print_peg board.(i).(j)
43- done;
44- print_newline()
45- done
46- *)
26+ for i = 0 to 8 do
27+ for j = 0 to 8 do
28+ print_peg board.(i).(j)
29+ done ;
30+ print_newline ()
31+ done
4732
4833type direction =
4934 { dx : int
@@ -60,13 +45,9 @@ type move =
6045 ; y2 : int
6146 }
6247
63- let moves = Array. make 31 { x1 = 0 ; y1 = 0 ; x2 = 0 ; y2 = 0 }
64-
65- let counter = ref 0
66-
6748exception Found
6849
69- let rec solve m =
50+ let rec solve board moves counter m =
7051 counter := ! counter + 1 ;
7152 if m = 31
7253 then
@@ -75,11 +56,6 @@ let rec solve m =
7556 | _ -> false
7657 else
7758 try
78- (*
79- if !counter mod 500 = 0 then begin
80- print_int !counter; print_newline()
81- end;
82- *)
8359 for i = 1 to 7 do
8460 for j = 1 to 7 do
8561 match board.(i).(j) with
@@ -95,15 +71,10 @@ let rec solve m =
9571 | Peg -> (
9672 match board.(i2).(j2) with
9773 | Empty ->
98- (*
99- print_int i; print_string ", ";
100- print_int j; print_string ") dir ";
101- print_int k; print_string "\n";
102- *)
10374 board.(i).(j) < - Empty ;
10475 board.(i1).(j1) < - Empty ;
10576 board.(i2).(j2) < - Peg ;
106- if solve (m + 1 )
77+ if solve board moves counter (m + 1 )
10778 then (
10879 moves.(m) < - { x1 = i; y1 = j; x2 = i2; y2 = j2 };
10980 raise Found );
@@ -119,4 +90,29 @@ let rec solve m =
11990 false
12091 with Found -> true
12192
122- let _ = if solve 0 then ( (* print_string "\n"; print_board board*) ) else assert false
93+ let solve () =
94+ let board =
95+ [| [| Out ; Out ; Out ; Out ; Out ; Out ; Out ; Out ; Out |]
96+ ; [| Out ; Out ; Out ; Peg ; Peg ; Peg ; Out ; Out ; Out |]
97+ ; [| Out ; Out ; Out ; Peg ; Peg ; Peg ; Out ; Out ; Out |]
98+ ; [| Out ; Peg ; Peg ; Peg ; Peg ; Peg ; Peg ; Peg ; Out |]
99+ ; [| Out ; Peg ; Peg ; Peg ; Empty ; Peg ; Peg ; Peg ; Out |]
100+ ; [| Out ; Peg ; Peg ; Peg ; Peg ; Peg ; Peg ; Peg ; Out |]
101+ ; [| Out ; Out ; Out ; Peg ; Peg ; Peg ; Out ; Out ; Out |]
102+ ; [| Out ; Out ; Out ; Peg ; Peg ; Peg ; Out ; Out ; Out |]
103+ ; [| Out ; Out ; Out ; Out ; Out ; Out ; Out ; Out ; Out |]
104+ |]
105+ in
106+ let moves = Array. make 31 { x1 = 0 ; y1 = 0 ; x2 = 0 ; y2 = 0 } in
107+ let counter = ref 0 in
108+ solve board moves counter 0 , board
109+
110+ let _ =
111+ for _ = 0 to 200 do
112+ let solved, board = solve () in
113+ if solved
114+ then ()
115+ else (
116+ print_string " Failed:\n " ;
117+ print_board board)
118+ done
0 commit comments