initial commitand fix ocaml bug
This commit is contained in:
parent
24ffcd09bd
commit
3c3a7093ba
2 changed files with 156 additions and 0 deletions
122
pagination.ml
Normal file
122
pagination.ml
Normal file
|
@ -0,0 +1,122 @@
|
||||||
|
(*我們先假設 P (i,j),意思是當裡面有 i 行文,j 張圖的時候,存放的分頁資訊,其型別為 Pagination*)
|
||||||
|
type pagination = {mutable isPagizable : bool; mutable noOfPages : int; mutable predecessor : int * int};;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
let t = 300;; (* 行數 *)
|
||||||
|
let f = 25;; (* 圖數 *)
|
||||||
|
|
||||||
|
let maxHeight = 27.0;;
|
||||||
|
let minHeight = 20.0;;
|
||||||
|
|
||||||
|
(*行屬性:height 高度,spaceHeight 其後空白高度,isPagizable 其後空白是否可分頁*)
|
||||||
|
type line = {height : float; spaceHeight : float; mutable isPagizable : bool};;
|
||||||
|
|
||||||
|
let tArray = Array.make (t+1) {height = 0.8; spaceHeight = 0.7; isPagizable = true};;
|
||||||
|
|
||||||
|
let fArray = Array.make (f+1) {height = 12.0; spaceHeight = 1.1; isPagizable = true};;
|
||||||
|
|
||||||
|
(*tArray與fArray 第0行是空行*)
|
||||||
|
let _ = tArray.(0) <- {height = 0.0; spaceHeight = 0.0; isPagizable = false} in
|
||||||
|
let _ = fArray.(0) <- {height = 0.0; spaceHeight = 0.0; isPagizable = false} in
|
||||||
|
for i = 1 to t do
|
||||||
|
if i / 9 == 3 then
|
||||||
|
let _ = tArray.(i).isPagizable <- false in ()
|
||||||
|
else
|
||||||
|
()
|
||||||
|
done
|
||||||
|
|
||||||
|
(*連 p 0 0 都要加進去所以需要輸入 t+1 和 f+1 的矩陣*)
|
||||||
|
let p = Array.init (t+1) (fun x -> (Array.init (f+1) (fun x -> {isPagizable = false; noOfPages = -1; predecessor=(-1,-1)})) );;
|
||||||
|
|
||||||
|
let nil = -1;; (*condition value*)
|
||||||
|
|
||||||
|
|
||||||
|
(* 圖片 k 對到哪一個文字*)
|
||||||
|
let referId k =
|
||||||
|
if k <= 1 then 1
|
||||||
|
else if k <= 3 then 9
|
||||||
|
else if k <= 6 then 40
|
||||||
|
else if k==7 then 42
|
||||||
|
else if k <= 10 then 70
|
||||||
|
else if k == 11 then 80
|
||||||
|
else if k <= 15 then 112
|
||||||
|
else if k == 16 then 120
|
||||||
|
else if k == 17 then 130
|
||||||
|
else if k <= 22 then 179
|
||||||
|
else 180
|
||||||
|
|
||||||
|
(*組頁*)
|
||||||
|
let makeOnePage (p : pagination array array) a b i j =
|
||||||
|
if a == i && b == j then false
|
||||||
|
else if p.(a).(b).isPagizable == false then false
|
||||||
|
else if (referId j) > i || (referId j) == 0 then false
|
||||||
|
else
|
||||||
|
let textAndSpaceHeight =
|
||||||
|
if a == i then 0.0
|
||||||
|
else
|
||||||
|
let textHeight = Array.fold_right (+.) (Array.map (fun x -> x.height) (Array.sub tArray (a+1) (i-a))) 0.0 in
|
||||||
|
let textSpaceHeight = Array.fold_right (+.) (Array.map (fun x -> x.spaceHeight) (Array.sub tArray (a+1) (i-a-1))) 0.0 in
|
||||||
|
textHeight +. textSpaceHeight in
|
||||||
|
let figAndSpaceHeight =
|
||||||
|
if b == j then 0.0
|
||||||
|
else
|
||||||
|
let figHeight = Array.fold_right (+.) (Array.map (fun x -> x.height) (Array.sub fArray (b+1) (j-b))) 0.0 in
|
||||||
|
let figSpaceHeight = Array.fold_right (+.) (Array.map (fun x -> x.spaceHeight) (Array.sub fArray (b+1) (j-b-1))) 0.0 in
|
||||||
|
figHeight +. figSpaceHeight in
|
||||||
|
let inputHeight = textAndSpaceHeight +. figAndSpaceHeight in
|
||||||
|
if inputHeight > maxHeight then false
|
||||||
|
else if inputHeight < minHeight then false
|
||||||
|
else true;;
|
||||||
|
|
||||||
|
|
||||||
|
(*以下是分頁程式*)
|
||||||
|
let pagize p =
|
||||||
|
let _ = p.(0).(0) <- {isPagizable = true; noOfPages = 0; predecessor = (nil , nil)} in
|
||||||
|
for i=0 to t do
|
||||||
|
for j=0 to f do
|
||||||
|
for a = 0 to i do
|
||||||
|
for b = 0 to j do
|
||||||
|
if i != 0 || j != 0 then
|
||||||
|
let canMakeOnePage = makeOnePage p a b i j in
|
||||||
|
if canMakeOnePage then
|
||||||
|
let _ = p.(i).(j).isPagizable <- true in
|
||||||
|
let _ = p.(i).(j).predecessor <- (a, b) in
|
||||||
|
let _ = p.(i).(j).noOfPages <- p.(i).(j).noOfPages + 1 in
|
||||||
|
()
|
||||||
|
else
|
||||||
|
()
|
||||||
|
done
|
||||||
|
done
|
||||||
|
done
|
||||||
|
done;;
|
||||||
|
|
||||||
|
pagize p;;
|
||||||
|
|
||||||
|
|
||||||
|
for i=0 to t do
|
||||||
|
for j=0 to f do
|
||||||
|
let x1,y1 = p.(i).(j).predecessor in
|
||||||
|
Printf.printf "%d\t%d->%d\t%d\n" i j x1 y1
|
||||||
|
done
|
||||||
|
done;;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
let costFuncOfPredecessor p i j pred =
|
||||||
|
let tracePage = ref [(i, j)] in
|
||||||
|
let movablePred = ref pred in
|
||||||
|
|
||||||
|
let _ =
|
||||||
|
while !movablePred != (-1, -1) do
|
||||||
|
let _ = tracePage := !movablePred :: !tracePage in
|
||||||
|
let (x, y) = !movablePred in
|
||||||
|
let _ = movablePred := p.(x).(y).predecessor in Printf.printf "%d\t%d\n" x y
|
||||||
|
done
|
||||||
|
in !tracePage;;
|
||||||
|
|
||||||
|
costFuncOfPredecessor p 300 25 p.(300).(25).predecessor;;
|
34
res.txt
34
res.txt
|
@ -7824,3 +7824,37 @@
|
||||||
300 23->300 21
|
300 23->300 21
|
||||||
300 24->300 22
|
300 24->300 22
|
||||||
300 25->300 23
|
300 25->300 23
|
||||||
|
300 23
|
||||||
|
300 21
|
||||||
|
300 19
|
||||||
|
300 17
|
||||||
|
300 15
|
||||||
|
300 13
|
||||||
|
300 11
|
||||||
|
300 9
|
||||||
|
300 7
|
||||||
|
300 5
|
||||||
|
300 3
|
||||||
|
300 1
|
||||||
|
294 0
|
||||||
|
280 0
|
||||||
|
266 0
|
||||||
|
252 0
|
||||||
|
238 0
|
||||||
|
224 0
|
||||||
|
210 0
|
||||||
|
196 0
|
||||||
|
182 0
|
||||||
|
168 0
|
||||||
|
154 0
|
||||||
|
140 0
|
||||||
|
126 0
|
||||||
|
112 0
|
||||||
|
98 0
|
||||||
|
84 0
|
||||||
|
70 0
|
||||||
|
56 0
|
||||||
|
42 0
|
||||||
|
28 0
|
||||||
|
14 0
|
||||||
|
0 0
|
||||||
|
|
Loading…
Reference in a new issue