from fractions import Fraction from collections import deque start = [[0]*3 for i in range(3)] start[0][0], start[1][1], start[2][2] = 2, 3, 4 queue = deque([str(start)]) states = {queue[-1]: []} minDiff = (100, []) while queue: cur = queue.popleft() for x in range(3): for y in range(3): if x == y: continue state = eval(cur) diff = min(4-sum(state[y]), sum(state[x])) portions = [Fraction(state[x][i], sum(state[x])) * diff for i in range(3)] for i in range(3): state[y][i] += portions[i] state[x][i] -= portions[i] for i in range(3): if min(state[i]) == 0: continue perc_diff = Fraction(max(state[i]) - min(state[i]), sum(state[i])) if perc_diff < minDiff[0]: minDiff = (perc_diff, states[cur] + [(x + 1, y + 1)]) print(minDiff) state = str(state) if state in states: continue states[state] = states[cur] + [(x + 1, y + 1)] queue += [state]