from graph import *
from bfs import bfs

def jugGraph(A, B):     # capacities of 2 jugs
    def moves(pair):
        a, b = pair
        a2b = min(a, B-b)
        b2a = min(b, A-a)
        return [(A, b),         # fill A jug
                (a, B),         # fill B jug
                (a-a2b, b+a2b),
                                # pour B jug into A jug
                (a+b2a, b-b2a),
                                # pour A jug into B jug
                (0, b),         # empty A jug
                (a, 0)]         # empty B jug
    g = Graph()
    newStates = set()
    allStates = set()
    newStates.add((0,0))        # that's a tuple
    allStates.add((0,0))
    g.addVertex((0,0))
    while len(newStates) != 0:
        s = newStates.pop()     # remove an arbitrary element
        sv = g.getVertex(s)
        for t in moves(s):
            if t not in allStates:
                newStates.add(t)
                allStates.add(t)
                tv = g.addVertex(t)
            else:
                tv = g.getVertex(t)
            if t != s:
                sv.addNeighbor(tv)
    return g

def solve(g, k):
    class GotIt (Exception):
        def __init__(self, s):
            self.end_state = s
    def eureka(from_s, to_s):   # from_v and to_v are nodes
        to_s.setPred(from_s)
        a, b = to_s.id
        if a == k or b == k:
            raise GotIt(to_s)
    try:
        for v in g:
            v.setColor('white')
        bfs(g, (0,0), eureka)
    except GotIt as e:
        n = e.end_state
        stk = [n]
        s = g.getVertex((0,0))
        while n != s:
            n = n.getPred()
            stk.append(n)
        while len(stk) > 0:
            print stk.pop().id,
        print ""
