4枚硬币翻转难题:巧用枚举法求最少翻转次数
分析问题: 每次翻转3枚硬币,相当于改变其中3个硬币的状态(0变1,1变0)。 目标:全部变为0或全部变为1。 设硬币状态为 a b c d(每个为0或1)。 定义翻转操作: - 翻转第1、2、3枚硬币 - 翻转第1、2、4枚硬币 - 翻转第1、3、4枚硬币 - 翻转第2、3、4枚硬币 每种操作可以执行0次或多次,但执行两次等于没执行,所以最多执行一次。 因此枚举所有2^4=16种操作组合,检查能否达到全0或全1,并记录最少操作次数。 代码实现: ```python coins = list(map(int, input().split())) min_flips = 5 # 大于4即可 # 枚举4种操作的选择情况(0表示不执行,1表示执行) for mask in range(16): state = coins[:] flips = 0 # 4种操作 if mask & 1: # 操作1:翻1,2,3 state[0] ^= 1 state[1] ^= 1 state[2] ^= 1 flips += 1 if mask & 2: # 操作2:翻1,2,4 state[0] ^= 1 state[1] ^= 1 state[3] ^= 1 flips += 1 if mask & 4: # 操作3:翻1,3,4 state[0] ^= 1 state[2] ^= 1 state[3] ^= 1 flips += 1 if mask & 8: # 操作4:翻2,3,4 state[1] ^= 1 state[2] ^= 1 state[3] ^= 1 flips += 1 # 检查是否全0或全1 if len(set(state)) == 1: min_flips = min(min_flips, flips) print(min_flips) ``` 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: - 枚举操作组合时,注意二进制位与操作的对应关系,避免遗漏或重复 - 状态修改前要使用副本,避免影响后续枚举 - 边界情况如初始已满足条件时,确保最小翻转次数正确初始化和更新 ######[AI写代码神器 | 569点数解答 | 2025-10-24 15:08:30]