-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSlicerService.kt
More file actions
103 lines (86 loc) · 3.58 KB
/
SlicerService.kt
File metadata and controls
103 lines (86 loc) · 3.58 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
package services
import model.Pizza
import model.Slice
class SlicerService {
fun getSlices(pizza: Pizza): List<Slice> {
var slices: MutableList<Slice> = emptyList<Slice>().toMutableList()
for (row in 0..(pizza.R - 1)) {
for (column in 0..(pizza.C - 1)) {
if (!pizza.table[row][column].used) {
val slice = getSliceFrom(pizza, row, column)
if (slice != null) {
slices.add(slice)
}
}
}
}
return slices.map { slice -> getBetterSlice(pizza, slice) }
}
private fun getSliceFrom(pizza: Pizza, row: Int, column: Int): Slice? {
var currentColumn = column
var currentRow = row
var currentSize = 1
var numColumns = 1
while (currentSize <= pizza.H && currentColumn < pizza.C) {
while (currentSize <= pizza.H && currentRow < pizza.R) {
val slice = Slice(column, currentColumn, row, currentRow)
if (checkSlice(slice, pizza)) {
markCellsAsUsed(pizza, row, currentRow, column, currentColumn)
return slice
}
currentRow++
currentSize += numColumns
}
numColumns++
currentSize = numColumns
currentRow = 0
currentColumn++
}
return null
}
private fun getBetterSlice(pizza: Pizza, slice: Slice): Slice {
if (checkSliceSize(slice, pizza.H)) {
var currentColumn = slice.endColumn
var currentRow = slice.endRow + 1
var numColumns = ((slice.endColumn - slice.startColumn) + 1)
var currentSize = numColumns * ((currentRow - slice.startRow) + 1)
while (currentSize <= pizza.H && currentColumn < pizza.C) {
while (currentSize <= pizza.H && currentRow < pizza.R) {
val betterSlice = Slice(slice.startColumn, currentColumn, slice.startRow, currentRow)
if (checkSlice(betterSlice, pizza)) {
markCellsAsUsed(pizza, betterSlice.startRow, currentRow, betterSlice.startColumn, currentColumn)
return betterSlice
}
currentRow++
currentSize += numColumns
}
numColumns++
currentSize = numColumns
currentRow = 0
currentColumn++
}
}
return slice
}
private fun checkSlice(slice: Slice, pizza: Pizza): Boolean =
checkSliceIngredients(slice, pizza) && checkSliceSize(slice, pizza.H)
private fun checkSliceSize(slice: Slice, H: Int): Boolean =
((slice.endColumn - slice.startColumn) + 1) * ((slice.endRow - slice.startRow) + 1) <= H
private fun checkSliceIngredients(slice: Slice, pizza: Pizza): Boolean {
var mushrooms = 0
var tomatoes = 0
for (row in slice.startRow..slice.endRow) {
for (column in slice.startColumn..slice.endColumn) {
if (pizza.table[row][column].ingredient.equals("M")) mushrooms++ else tomatoes++
}
}
return tomatoes >= pizza.L && mushrooms >= pizza.L
}
private fun markCellsAsUsed(pizza: Pizza, startingRow: Int, endingRow: Int, startingColumn: Int, endingColumn: Int) {
for (row in startingRow..endingRow) {
for (column in startingColumn..endingColumn) {
pizza.table[row][column].used = true
}
}
}
}