Advertisement
Guest User

Kody 2

a guest
Jan 15th, 2019
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 2.77 KB | None | 0 0
  1. (*Zadania z kolokwiów*)
  2. (*1 III13/14*)
  3. (*Postiadamu globalnie zadeklarowany graph g*)
  4. let path () =
  5.   let n = size g in
  6.   let length = Array.make n 0 in
  7.   let look akt l =
  8.     List.fold_left (fun wyn node ->
  9.       if akt < node then max (length.(node)+1) wyn
  10.       else wyn) 0 l in
  11.  
  12.   let wynik = ref 0 in
  13.  
  14.   for i = (n-1) downto 0 do
  15.     let l = neighbours g i in
  16.     wynik:= look i l;
  17.     length.(i) <- !wynik
  18. done;
  19. !wynik;;
  20. (* Kolokwium 2017/18 *)
  21. open Array;;
  22. let segment t =
  23.     let n = Array.length t in
  24.     let dp = make_matrix n n 0 in
  25.     let fib = make (n + 1) 0 in
  26.     fib.(1) <- 1; fib.(2) <- 1;
  27.     let i = ref 3 in
  28.     while !i <= n
  29.     do
  30.         fib.(!i) <- fib.(!i - 1) + fib.(!i - 2); i := !i + 1;
  31.     done;
  32.     i := 0; let j = ref 0 in
  33.     while !i < n
  34.     do
  35.         j := 2;
  36.         while !j <= n
  37.         do
  38.             if t.(!i) = fib.(!j) then dp.(!i).(!i) <- !j;
  39.             j := !j + 1;
  40.         done;
  41.         i := !i + 1;
  42.     done;
  43.     let odp = ref 0 in
  44.     i := 1;
  45.     while !i < n
  46.     do
  47.         j := 0;
  48.         while !i + !j < n
  49.         do
  50.             let l = ref !j in
  51.             while !l < !i + !j
  52.             do
  53.                 let a = dp.(!j).(!l) and b = dp.(!l + 1).(!j + !i) in
  54.                 if a = 2 && b = 2
  55.                 then dp.(!j).(!j + !i) <- 3
  56.                 else if a - b = 1 || a - b = -1
  57.                 then dp.(!j).(!j + !i) <- max a b + 1;
  58.                 l := !l + 1;
  59.             done;
  60.             odp := max !odp dp.(!j).(!j + !i);
  61.             j := !j + 1;
  62.         done;
  63.         i := !i + 1;
  64.     done;
  65.     !odp;;
  66.        
  67. (*segment [|4; 2; 1; 2; 3; 5; 2; 8; 7|];;*)
  68.  
  69. (* sadzawka [| [|2; 3; 2|]; [|2; 1; 2|]; [|2; 2; 2|] |] (1, 1) *)
  70.  
  71. let sadzawka sadz (x, y) =
  72.     let xsize = Array.length sadz in
  73.     let ysize = Array.length sadz.(0) in
  74.     let rozmiar = xsize * ysize in
  75.     let kolejka = make (rozmiar + 1) [] in
  76.     let i = ref 0 and j = ref 0 in
  77.     while !i < xsize
  78.     do
  79.         while !j < ysize
  80.         do
  81.             let pole = sadz.(!i).(!j) in
  82.             kolejka.(pole) <- ((!i, !j)::kolejka.(pole));
  83.             j := !j + 1;
  84.         done;
  85.         i := !i + 1;
  86.     done;
  87.     let lider = init (rozmiar + 1) (fun x -> x) in
  88.     let rec f a =
  89.         if lider.(a) = a then a
  90.             else begin lider.(a) <- f lider.(a); lider.(a) end
  91.     in
  92.     let union a b =
  93.         if f b = rozmiar then lider.(f a) <- f b
  94.             else lider.(f b) <- f a
  95.     in
  96.     i := rozmiar;
  97.     let jest = ref false in
  98.     while !jest = false && !i > 0
  99.     do
  100.         let rec dod lis =
  101.             match lis with
  102.             | [] -> ()
  103.             | (ax, ay)::t ->
  104.                 if ax = 0 || ax = xsize - 1 || ay = 0 || ay = ysize - 1 then
  105.                     union rozmiar (ax * ysize + ay);
  106.                 if ax > 0 then union ((ax - 1) * ysize + ay) (ax * ysize + ay);
  107.                 if ax < xsize - 1 then union ((ax + 1) * ysize + ay) (ax * ysize + ay);
  108.                 if ay > 0 then union (ax * ysize + ay - 1) (ax * ysize + ay);
  109.                 if ay < ysize - 1 then union (ax * ysize + ay + 1) (ax * ysize +ay);
  110.                 dod t
  111.             in
  112.             dod kolejka.(!i);
  113.             if f (x * ysize + y) = rozmiar && sadz.(x).(y) >= !i then jest := true;
  114.             i := !i - 1;
  115.     done;  
  116.     !i + 2;;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement