-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
122 lines (97 loc) · 3.36 KB
/
main.py
File metadata and controls
122 lines (97 loc) · 3.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
def solve(filename):
# parsing
f = open("inputs/"+filename+".in")
R, C, L, H = [int(x) for x in f.readline().split()]
pizza = []
for i in range(R):
pizza.append(f.readline())
def count(r1, c1, r2, c2):
rows = [pizza[i][c1:c2+1] for i in range(r1, r2 + 1)]
reduceFunc = lambda (t,m), c: (t+1,m) if c == 'T' else (t,m+1)
perRow = [reduce(reduceFunc, row, (0,0)) for row in rows]
return reduce(lambda (tt,tm),(t,m): (tt+t, tm+m), perRow, (0,0))
def isFree(x,y):
return firstFreePerCol[y] <= x
def isSliceFree(r1, c1, r2, c2):
for x in range(r1, r2 + 1):
for y in range(c1, c2 + 1):
if not isFree(x,y):
return False
return True
def isValid(r1, c1, r2, c2):
if r2 < R and c2 < C and isSliceFree(r1, c1, r2, c2):
t, m = count(r1, c1, r2, c2)
return t >= L and m >= L and t+m <= H
else:
return False
slices = []
dimIndexes = []
firstFreePerCol = [0 for i in range(C)]
dimensions = []
def calcDimensions():
for T in range(H, 0, -1):
for h in range(1, T + 1):
if T % h == 0:
w = T/h
dimensions.append((w, h))
def firstFree():
firstI, firstJ = (R, C)
for (j, i) in enumerate(firstFreePerCol):
if(i < firstI):
firstI, firstJ = (i, j)
return (firstI, firstJ)
def countFree():
return reduce(lambda c, (j,i): c + R - i, enumerate(firstFreePerCol), 0)
def updateFreeOnPush(r1, c1, r2, c2):
height = r2 - r1 + 1
for j in range(c1, c2 + 1):
firstFreePerCol[j] += height
def updateFreeOnPop(r1, c1, r2, c2):
height = r2 - r1 + 1
for j in range(c1, c2 + 1):
firstFreePerCol[j] -= height
def pushSlice(r1, c1, r2, c2):
slice = (r1, c1, r2, c2)
slices.append(slice)
updateFreeOnPush(*slice)
def popSlice():
slice = slices.pop()
updateFreeOnPop(*slice)
return dimIndexes.pop()
def createSlice(cell, dim):
(i, j) = cell
(w, h) = dim
return (i, j, i + w - 1, j + h - 1)
calcDimensions()
# base algorithm
def solveWithThreShold(threshold):
dimIndex = 0
while True:
slice = createSlice(firstFree(), dimensions[dimIndex])
if isValid(*slice):
pushSlice(*slice)
dimIndexes.append(dimIndex)
dimIndex = 0
if countFree() <= threshold:
break
else:
dimIndex += 1
while dimIndex >= len(dimensions):
if len(slices) <= 0:
return False
dimIndex = popSlice() + 1
return True
for t in range(R*C):
if(solveWithThreShold(t)):
print(t)
break
#write output
fout = open("submissions/"+filename+".out", "w")
fout.write(str(len(slices))+"\n")
for slice in slices:
r1, c1, r2, c2 = slice
fout.write(str(r1)+" "+str(c1)+" "+str(r2)+" "+str(c2)+"\n")
solve("small")
solve("example")
solve("medium")
solve("large")