def solve(N, world):
if N == 1:
return 0
d = Dinic(N * N + 2)
for u, v in world.allEdges():
d.add_edge(u, v, 1, True)
start = N * N
goal = start + 1
for pos in world.allPosition():
x, y = divmod(pos, N)
if world.mapdata[pos] != CHAR_Q:
p1 = (world.mapdata[pos] == CHAR_B)
p2 = ((x + y) % 2 == 0)
if p1 ^ p2:
d.add_edge(start, pos, 100)
else:
d.add_edge(pos, goal, 100)
f = d.max_flow(start, goal)
return (2 * N * (N - 1)) - f