题解 | 小心火烛的歪
小心火烛的歪
https://www.nowcoder.com/practice/6cdb80dbb66c42eea179068a4afb25db
import sys n, m, q = map(int, input().split()) Init_state ="" for _ in range(n): Init_state += input() def backward(X, list_ids): # 如果当前状态已经全部变为'1',记录下这组计划 if X == '1' * (n * m): ans.append(list_ids[:]) return # 尝试每一个有效的计划 for idx, plan in valid_plan.items(): if not list_ids or (idx not in list_ids and idx > list_ids[-1]): list_ids.append(idx) backward(plan_or(X, plan), list_ids) list_ids.pop() def plan_or(A, B): return ''.join(['1' if a == '1' or b == '1' else '0' for a, b in zip(A, B)]) # 若初始没有0,则不需要计划,输出0 if Init_state.count("0") ==0: print(0) else: plan = [] for _ in range(q): tem ="" for _ in range(n): tem += input() # print(tem) plan.append(tem) # 筛选计划,若存在与初始重叠的就排除,找出可行的计划 valid_plan = {} for i in range(q): if (''.join(['2' if a=='1' and b=='1' else '0' for a,b in zip(Init_state,plan[i])]).count('2')==0): valid_plan[i+1] = plan[i] # 若没有合适的计划,直接结束 if len(valid_plan) ==0 or max(map(int,valid_plan.values())) ==0: print(-1) else: # 验证plan_or函数 # for idx,plan in valid_plan.items(): # print(plan_or(Init_state,plan)) # 判断有无满足的方案 ans=[] # 初始化回溯 backward(Init_state, []) # 输出结果 # print(ans) min_num=float('inf') if ans: for ans_x in ans: if len(ans_x)<min_num: ans_min=ans_x min_num=len(ans_x) print(min_num) print(' '.join(map(str,ans_min))) else: print(-1)