from networkx import *
G=DiGraph() # Attention, le graphe est dirigé
G.add_node((0,0)) # Au début, deux récipients vides
def prochain_coup(a,b):
# Soit on vide a, soit on vide b, soit on remplit a, soit on remplit b
X=[(0,b),(a,0),(3,b),(a,5)]
# Il reste à envisager les deux derniers coups possibles.
A=a
B=b
while A<3 and B>0:
A+=1
B-=1
X.append((A,B))
A=a
B=b
while A>0 and B<5:
A-=1
B+=1
X.append((A,B))
return X
def gagner(G):
# On gagne dès qu'un sommet a pour deuxième coordonnée 4 return len([k for k in G.nodes() if k[1]==4])>=1
def prochaine_profondeur(G):
L=[]
for k in G.nodes():
for l in prochain_coup(k[0],k[1]):
if l not in L:
L.append((k,l))
for k in L:
G.add_edge(k[0],k[1])
return G
while not gagner(G):
G= prochaine_profondeur(G)
import pylab as P
draw(G)
P.show()