import itertools
state0 = [0,0,8] #水桶的初始状态
state1=[0,4,4] #水桶最终状态
maxv = [3,5,8] #每个水桶的对应的容积
allowed=list(itertools.permutations(range(3),2)) #1-->2,2-->1,1-->3,3-->1,2-->3,3-->2共6种可能
def nextstate(state0): #对于状态state0,推出所有可能的下一状态
for i,j in allowed:
a,b=state0[i],state0[j] # a-->b
if a>0 and b<maxv[j]:
nxtState = list(state0)
if a + b > maxv[j]: #部分倒入:a=a-(maxb-b)
nxtState[i] -= (maxv[j] - b)
nxtState[j] = maxv[j]
else: #a全部倒入b
nxtState[i] = 0
nxtState[j] = a+b
yield nxtState
n=0
def findway(ways):
global n #多少种方法
for state in nextstate(ways[-1]): #遍历下一状态(ways[-1]表示最后一个状态)
if state not in ways: #当前状态未出现过。
ways.append(state) #添加新结果
if state == state1:
n+=1
print('第%d种,共%d步:' %(n,len(ways)),ways) #输出结果
else:
findway(ways) #递归搜索
ways.pop() #去除当前循环中添加的状态(回归上一级,搜索另一支线。)
findway([state0])
第1种,共12步: [[0, 0, 8], [3, 0, 5], [0, 3, 5], [3, 3, 2], [1, 5, 2], [0, 5, 3], [3, 2, 3], [0, 2, 6], [2, 0, 6], [2, 5, 1], [3, 4, 1], [0, 4, 4]]
第2种,共9步: [[0, 0, 8], [3, 0, 5], [0, 3, 5], [3, 3, 2], [1, 5, 2], [1, 0, 7], [0, 1, 7], [3, 1, 4], [0, 4, 4]]
第3种,共16步: [[0, 0, 8], [3, 0, 5], [0, 3, 5], [3, 3, 2], [1, 5, 2], [1, 0, 7], [0, 1, 7], [3, 1, 4], [3, 5, 0], [0, 5, 3], [3, 2, 3], [0, 2, 6], [2, 0, 6], [2, 5, 1], [3, 4, 1], [0, 4, 4]]
第4种,共14步: [[0, 0, 8], [3, 0, 5], [0, 3, 5], [3, 3, 2], [1, 5, 2], [1, 0, 7], [0, 1, 7], [0, 5, 3], [3, 2, 3], [0, 2, 6], [2, 0, 6], [2, 5, 1], [3, 4, 1], [0, 4, 4]]
第5种,共13步: [[0, 0, 8], [3, 0, 5], [0, 3, 5], [3, 3, 2], [1, 5, 2], [3, 5, 0], [0, 5, 3], [3, 2, 3], [0, 2, 6], [2, 0, 6], [2, 5, 1], [3, 4, 1], [0, 4, 4]]
第6种,共12步: [[0, 0, 8], [3, 0, 5], [0, 3, 5], [3, 3, 2], [3, 5, 0], [0, 5, 3], [3, 2, 3], [0, 2, 6], [2, 0, 6], [2, 5, 1], [3, 4, 1], [0, 4, 4]]
第7种,共10步: [[0, 0, 8], [3, 0, 5], [0, 3, 5], [0, 5, 3], [3, 2, 3], [0, 2, 6], [2, 0, 6], [2, 5, 1], [3, 4, 1], [0, 4, 4]]
第8种,共10步: [[0, 0, 8], [3, 0, 5], [3, 5, 0], [0, 5, 3], [3, 2, 3], [0, 2, 6], [2, 0, 6], [2, 5, 1], [3, 4, 1], [0, 4, 4]]
第9种,共13步: [[0, 0, 8], [0, 5, 3], [3, 2, 3], [0, 2, 6], [2, 0, 6], [3, 0, 5], [0, 3, 5], [3, 3, 2], [1, 5, 2], [1, 0, 7], [0, 1, 7], [3, 1, 4], [0, 4, 4]]
第10种,共8步: [[0, 0, 8], [0, 5, 3], [3, 2, 3], [0, 2, 6], [2, 0, 6], [2, 5, 1], [3, 4, 1], [0, 4, 4]]
第11种,共15步: [[0, 0, 8], [0, 5, 3], [3, 2, 3], [0, 2, 6], [2, 0, 6], [2, 5, 1], [3, 4, 1], [3, 0, 5], [0, 3, 5], [3, 3, 2], [1, 5, 2], [1, 0, 7], [0, 1, 7], [3, 1, 4], [0, 4, 4]]
第12种,共16步: [[0, 0, 8], [0, 5, 3], [3, 2, 3], [0, 2, 6], [2, 0, 6], [2, 5, 1], [3, 4, 1], [3, 5, 0], [3, 0, 5], [0, 3, 5], [3, 3, 2], [1, 5, 2], [1, 0, 7], [0, 1, 7], [3, 1, 4], [0, 4, 4]]
第13种,共15步: [[0, 0, 8], [0, 5, 3], [3, 2, 3], [0, 2, 6], [2, 0, 6], [2, 5, 1], [3, 5, 0], [3, 0, 5], [0, 3, 5], [3, 3, 2], [1, 5, 2], [1, 0, 7], [0, 1, 7], [3, 1, 4], [0, 4, 4]]
第14种,共11步: [[0, 0, 8], [0, 5, 3], [3, 2, 3], [3, 0, 5], [0, 3, 5], [3, 3, 2], [1, 5, 2], [1, 0, 7], [0, 1, 7], [3, 1, 4], [0, 4, 4]]
第15种,共12步: [[0, 0, 8], [0, 5, 3], [3, 2, 3], [3, 5, 0], [3, 0, 5], [0, 3, 5], [3, 3, 2], [1, 5, 2], [1, 0, 7], [0, 1, 7], [3, 1, 4], [0, 4, 4]]
第16种,共11步: [[0, 0, 8], [0, 5, 3], [3, 5, 0], [3, 0, 5], [0, 3, 5], [3, 3, 2], [1, 5, 2], [1, 0, 7], [0, 1, 7], [3, 1, 4], [0, 4, 4]]
[Finished in 0.1s] |