Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2018
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 1.77 KB | None | 0 0
  1. (* Autor: Jan Kociniak
  2.    Reviewer: Piotr Wojtczak
  3.    WPF 2017Z - Przelewanka  *)
  4.  
  5.  
  6.  
  7. (* funkcja dorzucajaca do kolejki q wszystkie stany osiagalne ze stanu arr
  8.    z zaktualizowaną liczbą ruchów *)
  9.  
  10. let states (arr, d) q =
  11.   let n = Array.length arr and d1 = d+1 in
  12.     for i = 0 to n-1 do
  13.       let (xi, yi) = arr.(i) in
  14.       (* dolanie do pełna i-tej szklanki *)
  15.         arr.(i) <- (xi, xi);
  16.         Queue.add (Array.copy arr, d1) q;
  17.       (* oproznienie i-tej szklanki *)
  18.         arr.(i) <- (xi, 0);
  19.         Queue.add (Array.copy arr, d1) q;
  20.         (* reset *)
  21.         arr.(i) <- (xi, yi);
  22.       for j = i+1 to n-1 do
  23.         let (xj, yj) = arr.(j) in
  24.       (* przelanie z i do j *)
  25.         arr.(j) <- (xj, min (yj + yi) xj);
  26.         arr.(i) <- (xi, max 0 (yi - xj + yj));
  27.         Queue.add (Array.copy arr, d1) q;
  28.       (* przelanie z j do i *)
  29.         arr.(i) <- (xi, min (yi + yj) xi);
  30.         arr.(j) <- (xj, max 0 (yj - xi + yi));
  31.         Queue.add (Array.copy arr, d1) q;
  32.         (* reset *)
  33.         arr.(i) <- (xi, yi);
  34.         arr.(j) <- (xj, yj);
  35.       done;
  36.   done
  37.  
  38.  
  39.  
  40.   let przelewanka arr =
  41.     let n = Array.length arr in
  42.       let q = Queue.create() and been = Hashtbl.create (n*n)
  43.       and searching = ref true and res = ref 0 in
  44.        Queue.add ((Array.map (fun (x, _) -> (x, 0)) arr), 0) q;
  45.        while !searching && not (Queue.is_empty q) do
  46.          let (st, d) = Queue.take q in
  47.          if st = arr then
  48.            begin
  49.              res := d;
  50.              searching := false;
  51.            end
  52.          else
  53.            if not (Hashtbl.mem been (st, d)) then
  54.              begin
  55.                Hashtbl.add been (st, d) true;
  56.                states (st, d) q;
  57.              end
  58.        done;
  59.     if Queue.is_empty q then -1 else !res
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement