Advertisement
Guest User

Untitled

a guest
Dec 18th, 2016
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 2.52 KB | None | 0 0
  1. let valid_board n m = (* Determina se un taboleiro dado pode ser válido *)
  2.     n > 0 && m > 0
  3. ;;
  4.  
  5. let  valid_square n m (x, y) = (* Determina se unha casa existe nun taboleiro *)
  6.     x <= n && y <=m && x > 0 && y > 0
  7. ;;
  8.  
  9. let rec fusion l1 l2 = (* Devolve unha lista onde se fusiona cada elemento de l2 con cada elemento de l1 en pares *)
  10.         List.concat (List.map (fun y -> List.map (fun x -> (x,y)) l2 ) l1)
  11. ;;
  12.  
  13. let combinations x y = (* Retorna as combinacións posibles entre todos os elementos de dúas listas dadas, sen repetírense *)
  14.     List.rev_append (fusion x y) (fusion y x)
  15. ;;
  16.  
  17. (* q e w determinan todas as posibilidades do movemento da peza (neste caso o cabalo)
  18. é decir, as posibilidades son as combinacions dos elementos dunha lista cos de outra.
  19.  
  20. (x +/- r, y +/- s) onde r ou s = 1 ou 2 e r =/=s
  21.  
  22.  *)
  23.  
  24. let q = [1;-1];;
  25. let w = [2;-2];;
  26.  
  27.  
  28. let theoretical_squares (x,y) = (* Devolve todos os movementos teóricos da peza nunha posición inicial dada*)
  29.     List.map (fun (a,b) -> (a + x, b + y) ) (combinations q w)
  30. ;;
  31.  
  32. let rec one_to_n n = (* Devolve unha lista dende 1 ata n *)
  33.     if n = 0
  34.     then []
  35.     else one_to_n (n-1) @ [n]
  36. ;;
  37.  
  38. let board_squares n m = (* Devolve unha lista con todas as casas do taboleiro *)
  39.     fusion (one_to_n m) (one_to_n n)
  40. ;;
  41.  
  42. let possible_squares n m (x,y) = (* Devolve unha lista cos posibles movementos nun taboleiro dado *)
  43.     if valid_board n m
  44.     then List.filter (fun c -> valid_square n m c) (theoretical_squares (x,y))
  45.     else invalid_arg "possible_squares"
  46. ;;
  47.  
  48. let rec valid_path n m = function
  49.     | [] -> false
  50.     | h::[] -> true
  51.     | h::t -> not (List.mem h t) && List.mem (List.hd t) (possible_squares n m h) && valid_path n m t
  52. ;;
  53.  
  54. let is_final_path n m l (u,v) = (* Determina se unha lista contén un camiño que recorre todo o taboleiro (dado polas súas dimensións) ata a casa dada *)
  55.     List.length l = n*m && valid_path n m l && List.nth l (n*m - 1) = (u,v)
  56. ;;
  57.  
  58. let possible_squares_by_path n m l = match l with
  59.     | [] -> []
  60.     | h::t -> List.filter (fun c -> not (List.mem c l)) (possible_squares n m h)
  61. ;;
  62.  
  63. let rec generate_possible_paths n m l =
  64.     if List.length l = 0
  65.     then []
  66.     else List.map (fun c -> c::l) (possible_squares_by_path n m l)
  67. ;;
  68.  
  69. (* WIP *)
  70.  
  71. let generate_long_paths n m (x,y) =
  72.     let rec aux l =
  73.             match generate_possible_paths n m l with
  74.                 | [] -> []
  75.                 | h::t -> aux t @ generate_possible_paths n m h
  76.     in aux [(x,y)]
  77. ;;
  78.  
  79.  
  80. let knight_tour n m (x,y) (u,v) =
  81.     List.find (fun c -> is_final_path n m (List.rev c) (u,v)) (generate_long_path n m (x,y))
  82. ;;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement