有一个int数组arr其中只含有一、2和3,分别表明全部圆盘目前的状态,1表明左柱,2表明中柱,3表明右柱,arr[i]的值表明第i+1个圆盘的位置。好比,arr=[3,3,2,1],表明第1个圆盘在右柱上、第2个圆盘在右柱上、第3个圆盘在中柱上、第4个圆盘在左柱上。若是arr表明的状态是最优移动轨迹过程当中出现的状态,返回arr这种状态是最优移动轨迹中的第几个状态。若是arr表明的状态不是最优移动轨迹过程当中出现的状态,则返回-1。数组
给定一个int数组arr及数组的大小n,含义如题所述,请返回一个int,表明所求的结果。app
[3,3]
返回:3
解决思路:首先求出全部的状态,而后在这个状态集合中遍历一遍找到arr相等的状况。
step1: 若是只有一个汉诺塔,那么直接从左边移动到右边。
step2: 若是有2个汉诺塔,那么首先把上面的移动到中间,而后下面的移动到右边,最后再把中间的移动到右边。
step3: 若是有n个汉诺塔,那么能够按照step2的思路,先将上面的n-1个移动到中间,而后最下面的移动到右边,最后将中间的n-1个移动到右边。
代码实现以下:
class Hanoi: def chkStep(self, arr, n): # write code here self.initStatus = [1]*n self.allStatus = [[1]*n] self.move(n,1,2,3) i = 0 for s in self.allStatus: if s == arr: return i i = i+1 return -1 def move(self, n, left, mid, right): if n <= 0: return self.move(n-1, left, right, mid) self.change(n, right) self.move(n-1, mid, left, right) def change(self, n, right): self.initStatus[n-1] = right self.allStatus.append(self.initStatus[:])