Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- open List;;
- open Array;;
- (*Nasza tablica przechowujaca ustawienie klockow *)
- (* 100x100 *)
- let a = make_matrix 100 100 0;;
- let modu = 1000000007;;
- (* Zmienna trzymajaca odp *)
- let ans = ref 0;;
- (* Nasze klocki *)
- let klocki = make (15) ([],0);;
- (* Pionowe, poziome I*)
- klocki.(0) <- ([(0,0);(0,1);(0,2);(0,3)],0);;
- klocki.(1) <- ([(0,0);(1,0);(2,0);(3,0)],0);;
- (* J, obkrecenia w prawo za kadym razem *)
- klocki.(2) <- ([(0,0);(1,0);(1,1);(1,2)],1);;
- klocki.(3) <- ([(0,0);(1,0);(2,0);(0,1)],1);;
- klocki.(4) <- ([(0,0);(0,1);(0,2);(1,2)],1);;
- klocki.(5) <- ([(0,0);(0,1);(-1,1);(-2,1)],1);; (*Spr czy x>=2*)
- (* Klocki L *)
- klocki.(6) <- ([(0,0);(1,0);(0,1);(0,2)],2);;
- klocki.(7) <- ([(0,0);(1,1);(0,1);(2,1)],2);;
- klocki.(8) <- ([(0,0);(0,2);(0,1);(-1,1)],2);; (*x>=1*)
- klocki.(9) <- ([(0,0);(1,0);(2,0);(2,1)],2);;
- (* Klocki S*)
- klocki.(10) <- ([(0,0);(0,1);(-1,1);(-1,2)],3);; (*x>=1*)
- klocki.(11) <- ([(0,0);(1,0);(1,1);(2,1)],3);;
- (*Klocki Z *)
- klocki.(12) <- ([(0,0);(0,1);(1,1);(1,2)],4);;
- klocki.(13) <- ([(0,0);(0,1);(1,0);(-1,1)],4);; (*x>=1*)
- (* Klocek O *)
- klocki.(14) <- ([(0,0);(1,0);(0,1);(1,1)],5);;
- (* Funkcja sprawdzajaca, czy plansza n x m jest zapelniona.
- Jezeli jest- zwraca (-1,-1)
- Wpp. zwraca pare (i,j), oznaczajaca pierwsza znaleziona wolna pozycje*)
- let spr m n =
- let gdzie = ref (-1,-1) and i = ref 0 and j = ref 0
- in
- while (!gdzie = (-1,-1) && !i < n) do
- j := 0;
- while(!gdzie = (-1,-1) && !j < m) do
- if a.(!i).(!j) = 0 then gdzie := (!i,!j);
- incr j;
- done;
- incr i;
- done;
- !gdzie;;
- (* Funkcja sprawdzajaca, czy mozna dany klocek wstawic w dane miejsce *)
- let czy nr x y m n =
- if ((nr = 5 && x < 2) || (nr = 8 && x < 1) || (nr = 13 && x < 1)
- || (nr = 10 && x < 1)) then false
- else
- let k = List.fold_left
- (fun ak (c,d) -> if ((x+c) < m && (y+d) < n && a.(x+c).(y+d) = 0)
- then ak else ak+1) 0 (fst klocki.(nr))
- in if k > 0 then false
- else true;;
- (*Funkcja wstawiajaca klocek nr i na pozycji (x,y)*)
- let wstaw nr x y =
- List.iter (fun (c,d) -> a.(x+c).(y+d) <- 1) (fst klocki.(nr));;
- (*Funkcja zdejmujaca klocek nr i z pozycji (x,y)*)
- let zdejmij nr x y =
- List.iter (fun (c,d) -> a.(x+c).(y+d) <- 0) (fst klocki.(nr));;
- (*Funkcja iterujaca po kolejnych mozliwych klockach
- i szukajaca wszystkich rozwian*)
- let ii = ref 0 and j = ref 0;;
- let rec dopasuj m n kl =
- while (!ii < m) do
- j := 0;
- while( !j < n) do
- if a.(!ii).(!j) = 0 then
- for i = 0 to 14 do
- if((czy i (!ii) (!j) m n) && (kl.(snd klocki.(i)) > 0)) then
- begin
- kl.(snd klocki.(i)) <- kl.(snd klocki.(i)) - 1;
- wstaw i (!ii) (!j);
- dopasuj m n kl;
- zdejmij i (!ii) (!j);
- kl.(snd klocki.(i)) <- kl.(snd klocki.(i)) + 1;
- end;
- done;
- incr j;
- done;
- incr ii;
- done;
- if (spr m n = (-1,-1)) then ans:= !ans + 1;;
- (* Funkcja wykonujaca zasadnicza czesc programu -
- znajduje pierwsze wolne miejsce i probuje wstawic do niego pokolei klocki*)
- let tetris m n i j l s z o =
- ans := 0;
- if ((n * m) mod 4 <> 0 || ((i+j+l+s+z+o)*4)<(n*m)) then 0
- else begin
- dopasuj m n [|i;j;l;s;z;o|];
- !ans;
- end;;
Advertisement
Add Comment
Please, Sign In to add comment