|
@@ -201,6 +201,7 @@ class State:
|
|
|
"""
|
|
"""
|
|
|
Minimize the sum of dist(i,j) between all blocks i,j of the same color.
|
|
Minimize the sum of dist(i,j) between all blocks i,j of the same color.
|
|
|
Magnify vertical distances to avoid column stacking.
|
|
Magnify vertical distances to avoid column stacking.
|
|
|
|
|
+ Add the vertical components of i and j to prioritize lower columns.
|
|
|
"""
|
|
"""
|
|
|
def dist(i, j):
|
|
def dist(i, j):
|
|
|
yi, xi = divmod(i, COLUMNS)
|
|
yi, xi = divmod(i, COLUMNS)
|
|
@@ -211,7 +212,8 @@ class State:
|
|
|
if self.groups[i] == self.groups[j]:
|
|
if self.groups[i] == self.groups[j]:
|
|
|
return abs(yj - yi)
|
|
return abs(yj - yi)
|
|
|
|
|
|
|
|
- return abs(xj - xi) + abs(yj - yi) * 2 - 1
|
|
|
|
|
|
|
+ return abs(xj - xi) + abs(yj - yi) * 2 - 1 + \
|
|
|
|
|
+ (self.nrows - yi) + (self.nrows - yj)
|
|
|
|
|
|
|
|
colors = {}
|
|
colors = {}
|
|
|
for i, block in enumerate(self.blocks):
|
|
for i, block in enumerate(self.blocks):
|