题目:

分析:
1.深度为D的开关二叉树共有2^D -1 个开关,从上到下,从做到右排序1,2,3,…,2^D-1
2.最开始,这课开关二叉树上的所有开关都是关闭状态,假设为off状态,当有一个小球经过以后,开关由off状态变为on状态
3.举个例子(不举),假设D=4,则共有15个开关,顺序如图上。
1)第一个小球下落的时候,首先经过开关1,因为开关1是off状态,所以小球往左走,开关1 的状态变为on
2)小球到达2,因为开关2的状态是off,所以小球往左走,开关2的状态变为on
3)小球到达4,因为开关4的状态是off,所以小球往左走,开关4的状态变为on
4)小球到达8,走不了了,则第一个小球的终点就是8号开关
5)第二个小球,首先经过开关1,因为开关1是on状态,所以小球往右走,开关1变为off,
。。。
n)第二个小球抵达12号开关
4.每个小球都要经过开关1,所以遍历的时候需要设一个临时的变量k,记录小球走的开关号
5.若是小球从一个off的开关m经过,则下一步就是王左走,即2m号开关,否则走向2m+1号开关
6.小球最大编号不能超过2^D-1,小球走到某个开关以后,会把开关需要翻倍(2m或者2m+1),所以小球最终所在的开关需要要除以2

code below:

# coding=utf-8
import math
D = 4
I = 2

n = int(round((math.pow(2,D))-1))#2^D-1

s = {}

def reverseRes(num):
if num == 1:
return 0
elif num == 0:
return 1

"初始化所有开关"

for index in range(1,n,1):
s[index] = 0 #所有开关都关闭

for index in range(1,I+1,1):#遍历每个小球
k = 1#需要一个辅助的编号,因为小球每次都是从第一个开关经过的
while 1:
s[k] = reverseRes(s[k]) #小球经过的开关改变
if s[k] == 1:#小球经过以后,开关打开了,说明经过之前是闭合的,所以往左走
k = 2*k
else:
k = 2*k+1
if k > n:
break
print k/2

更简便的方法:

更多相关文章

  1. MEMCACHED缓存及状态查看
  2. 使用/proc/meminfo文件查看内存状态信息
  3. linux下如何杀掉D状态进程
  4. Linux网络状态工具ss命令使用详解
  5. 在linux上获取已连接电视的电源状态
  6. linux获取网线插拔状态的实现
  7. mysql--查看mysql状态的常用命令
  8. 查看 SQL Server 作业(job)运行结果状态脚本
  9. mysql主从状态异常解决办法

随机推荐

  1. https://developers.google.com/chrome/m
  2. android中使用wakelock
  3. 一个很有深度的Android Blog
  4. Android 新手入门指导
  5. android 签名
  6. Android studio生成APK打包,修改生成APK的
  7. Android 支持的文件类型
  8. Android控件属性大全
  9. Step Detector and Step Counter Sensors
  10. Android——PopupWindow