You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 00:41:12