Guest User

Untitled

a guest
Jan 20th, 2013
36
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 3.67 KB | None | 0 0
  1. open List;;
  2. open Array;;
  3.  
  4. (*Nasza tablica przechowujaca ustawienie klockow  *)
  5. (* 100x100 *)
  6. let a = make_matrix 100 100 0;;
  7.  
  8. let modu = 1000000007;;
  9.  
  10. (* Zmienna trzymajaca odp *)
  11. let ans = ref 0;;
  12.  
  13. (* Nasze klocki *)
  14. let klocki = make (15) ([],0);;
  15. (* Pionowe, poziome I*)
  16. klocki.(0) <- ([(0,0);(0,1);(0,2);(0,3)],0);;
  17. klocki.(1) <- ([(0,0);(1,0);(2,0);(3,0)],0);;
  18.  
  19. (* J, obkrecenia w prawo za kadym razem *)
  20. klocki.(2) <- ([(0,0);(1,0);(1,1);(1,2)],1);;
  21. klocki.(3) <- ([(0,0);(1,0);(2,0);(0,1)],1);;
  22. klocki.(4) <- ([(0,0);(0,1);(0,2);(1,2)],1);;
  23. klocki.(5) <- ([(0,0);(0,1);(-1,1);(-2,1)],1);; (*Spr czy x>=2*)
  24.  
  25. (* Klocki L *)
  26. klocki.(6) <- ([(0,0);(1,0);(0,1);(0,2)],2);;
  27. klocki.(7) <- ([(0,0);(1,1);(0,1);(2,1)],2);;
  28. klocki.(8) <- ([(0,0);(0,2);(0,1);(-1,1)],2);; (*x>=1*)
  29. klocki.(9) <- ([(0,0);(1,0);(2,0);(2,1)],2);;
  30.  
  31. (* Klocki S*)
  32. klocki.(10) <- ([(0,0);(0,1);(-1,1);(-1,2)],3);; (*x>=1*)
  33. klocki.(11) <- ([(0,0);(1,0);(1,1);(2,1)],3);;
  34.  
  35. (*Klocki Z *)
  36. klocki.(12) <- ([(0,0);(0,1);(1,1);(1,2)],4);;
  37. klocki.(13) <- ([(0,0);(0,1);(1,0);(-1,1)],4);; (*x>=1*)
  38.  
  39. (* Klocek O *)
  40. klocki.(14) <- ([(0,0);(1,0);(0,1);(1,1)],5);;
  41.  
  42. (* Funkcja sprawdzajaca, czy plansza n x m jest zapelniona.
  43. Jezeli jest- zwraca (-1,-1)
  44. Wpp. zwraca pare (i,j), oznaczajaca pierwsza znaleziona wolna pozycje*)
  45.  
  46. let spr m n =
  47.     let gdzie = ref (-1,-1) and i = ref 0 and j = ref 0
  48.     in
  49.      while (!gdzie = (-1,-1) && !i < n) do
  50.          j := 0;
  51.          while(!gdzie = (-1,-1) && !j < m) do
  52.             if a.(!i).(!j) = 0 then gdzie := (!i,!j);
  53.             incr j;
  54.                                            done;
  55.          incr i;
  56.                                           done;
  57.     !gdzie;;
  58.  
  59.  
  60. (* Funkcja sprawdzajaca, czy mozna dany klocek wstawic w dane miejsce *)
  61. let czy nr x y m n =
  62.     if ((nr = 5 && x < 2) || (nr = 8 && x < 1) || (nr = 13 && x < 1)
  63.         || (nr = 10 && x < 1)) then false
  64.     else
  65.     let k = List.fold_left
  66.       (fun ak (c,d) -> if ((x+c) < m && (y+d) < n && a.(x+c).(y+d) = 0)
  67.                        then ak else ak+1) 0 (fst klocki.(nr))
  68.     in if k > 0 then false
  69.        else true;;
  70.  
  71.  
  72. (*Funkcja wstawiajaca klocek nr i na pozycji (x,y)*)
  73. let wstaw nr x y =
  74.     List.iter (fun (c,d) -> a.(x+c).(y+d) <- 1) (fst klocki.(nr));;
  75.  
  76. (*Funkcja zdejmujaca klocek nr i z pozycji (x,y)*)
  77. let zdejmij nr x y =
  78.     List.iter (fun (c,d) -> a.(x+c).(y+d) <- 0) (fst klocki.(nr));;
  79.  
  80.  
  81. (*Funkcja iterujaca po kolejnych mozliwych klockach
  82.   i szukajaca wszystkich rozwian*)
  83. let ii = ref 0 and j = ref 0;;
  84. let rec dopasuj m n kl =
  85.  
  86.      while (!ii < m) do
  87.          j := 0;
  88.          while( !j < n) do
  89.             if a.(!ii).(!j) = 0 then
  90.             for i = 0 to 14 do
  91.                 if((czy i (!ii) (!j) m n) && (kl.(snd klocki.(i)) > 0)) then
  92.                              begin
  93.                              kl.(snd klocki.(i)) <- kl.(snd klocki.(i)) - 1;
  94.                              wstaw i (!ii) (!j);
  95.                              dopasuj m n kl;
  96.                              zdejmij i (!ii) (!j);
  97.                              kl.(snd klocki.(i)) <- kl.(snd klocki.(i)) + 1;
  98.                              end;
  99.                             done;
  100.             incr j;
  101.                                            done;
  102.          incr ii;
  103.                                           done;
  104.          if (spr m n = (-1,-1)) then  ans:= !ans + 1;;
  105.  
  106.  
  107. (* Funkcja wykonujaca zasadnicza czesc programu -
  108. znajduje pierwsze wolne miejsce i probuje wstawic do niego pokolei klocki*)
  109.  
  110. let tetris m n i j l s z o =
  111.     ans := 0;
  112.     if ((n * m) mod 4 <> 0 || ((i+j+l+s+z+o)*4)<(n*m)) then 0
  113.     else begin
  114.         dopasuj m n [|i;j;l;s;z;o|];
  115.         !ans;
  116.       end;;
Advertisement
Add Comment
Please, Sign In to add comment