Python越狱问题代码求助:无法正确统计释放囚犯数量
问题:越狱囚犯释放统计代码错误排查
监狱可用单元格列表表示,1代表未锁单元格,0代表已锁单元格。示例:[1, 1, 0, 0, 0, 1, 0]
从最左侧单元格出发,任务是统计能释放的囚犯数量,规则是每释放一名囚犯,所有单元格的锁状态翻转(锁变未锁,未锁变锁),且只能从左向右移动,不能回头。必须释放囚犯才会触发锁状态翻转,例如输入[1,1,1]时,释放第一个囚犯后,所有单元格变为[0,0,0],无法再释放更多囚犯。
我的代码如下:
prisoners = list(map(int(input("Please enter prisoner arrangement. e.g.0101010").strip())) freed = 0 for i in range(len(prisoners)): if prisoners[i] == 1: freed += 1 for j in range(len(prisoners)): prisoners[j] = 1 - prisoners[j] # toggle the status of current and future cells if i==len(prisoners): break print(freed)
我已查阅相关资料,但仍无法找出代码无法正确生成释放囚犯数量的原因,恳请告知代码中的错误。
代码错误分析与修正
1. 语法错误:输入处理缺少闭合括号
原代码的输入处理语句少了一个右括号,会直接触发SyntaxError导致代码无法运行,正确写法应为:
prisoners = list(map(int, input("Please enter prisoner arrangement. e.g.0101010").strip()))
2. 逻辑错误:全列表翻转导致状态判断混乱
你通过遍历修改整个列表实现状态翻转,不仅效率低下,还会让后续循环的单元格状态判断失效。比如第一次释放囚犯后,所有单元格被翻转,后续循环到下一个索引时,读取的是已经被翻转后的状态,无法准确对应当前应该判断的实际状态。
实际上不需要修改原列表,用一个变量记录翻转次数的奇偶性即可:
- 翻转偶数次,单元格状态与原始状态一致;
- 翻转奇数次,单元格状态与原始状态相反。
3. 无效代码:永远不会触发的break语句
if i==len(prisoners): break完全无效,因为range(len(prisoners))生成的索引最大值为len(prisoners)-1,永远不会等于len(prisoners),可直接删除。
修正后的代码
input_str = input("Please enter prisoner arrangement. e.g.0101010").strip() prisoners = list(map(int, input_str)) freed = 0 flip_times = 0 for original_state in prisoners: # 计算当前单元格实际状态:原始状态 异或 翻转次数的奇偶性 actual_state = original_state ^ (flip_times % 2) if actual_state == 1: freed += 1 flip_times += 1 print(freed)
代码说明
- 用
flip_times记录翻转次数,每释放一名囚犯就累加1; - 通过
original_state ^ (flip_times % 2)计算实际状态,异或操作等价于:翻转次数为奇数时状态取反,偶数时保持原样; - 无需修改原列表,避免了遍历修改的开销和逻辑混乱,严格遵循从左到右的移动规则。
内容的提问来源于stack exchange,提问作者Doudouyau
相关产品推荐
相关产品推荐

