题解 | 小心火烛的歪
小心火烛的歪
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)

