题解 | 小心火烛的歪

小心火烛的歪

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)
    



全部评论

相关推荐

10-09 17:17
已编辑
门头沟学院 Java
活泼的代码渣渣在泡池...:同学你好,我也是学院本,后天要面这个亚信科技,是实习,请问问题都啥样呀,我项目就做了网上的,这是第一次面试
投递多益网络等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务