第一行输入三个整数
代表草地的长、草地的宽、计划数量。
此后
行,每行输入
个字符,代表草地初始状态。
此后
行,每行输入
个字符,用于描述计划。
全部字符仅为数字
或
。
如果不存在满足要求的燃放方案,直接输出
。
否则,请按如下格式输出:
第一行上输出一个整数
代表使用到的计划数量。
第二行输出
个整数代表你所选择的计划编号。编号即输入顺序,从
开始计数。
如果存在多个解决方案,您可以输出任意一个,系统会自动判定是否正确。注意,自测运行功能可能因此返回错误结果,请自行检查答案正确性。
2 2 1 00 01 11 10
1 1
7 7 5 1110111 1111111 1100001 0101000 1100001 1111111 1110111 0001000 0000000 0000000 1000001 0000000 0000000 0001000 0000000 0000000 0011100 0000000 0011100 0000000 0000000 0000000 0000000 0000010 0000111 0000010 0000000 0000000 0000000 0000000 0010000 0010000 0010000 0000000 0000000 0000000 0000000 0010000 0010111 0010000 0000000 0000000
4 1 2 3 4
草地初始状态如下图所示。在这个样例中,选择
也是一个合法的答案。
#最优解如何实现呢?
n,m,q=list(map(int,input().split()))
s = []
re = []
res = []
for i in range(1,n*q+n+1):
x = 0
low = list(map(int,input()))
re.append(low)
if i % n == 0:
s.append(re)
re = []
start = s[0]
s = s[1:]
i = 0
while i < q:#排除杂物位置燃放烟花的计划
x = s[i]
flag = 0
exit_ = False
for j in range(n):
for k in range(m):
if x[j][k] == 1 and start[j][k] == 1:
exit_ = True
break
if exit_:
break
if not exit_ :
res.append(i)
i += 1
l = []
z = 0
for i in range(n):
for j in range(m):
if start[i][j]==0:
z = 1
if z ==0:
print('0')
elif z == 1 and len(res) == 0:
print('-1')
else:
y = 0
while y <len(res):
p = res[y]
r = s[p]
for i in range(n):
for j in range(m):
if r[i][j] == 1:
start[i][j] = 1
else:
continue
l.append(str(p+1))
flag = 0
for k in range(n):
for v in range(m):
if start[k][v]==0:
flag = 1
if flag == 1 and y == len(res)-1:
print('0')
if flag==0:
print(len(l))
print(' '.join(l))
break
if flag == 1:
y += 1 from itertools import combinations
def generate_blank_matrix(n, m):
return [[0 for _ in range(m)] for _ in range(n)]
def read_matrix(n):
matrix = [[] for _ in range(n)]
for i in range(n):
matrix[i] = list(map(int, list(input().strip())))
return matrix
def matrix_max(m1, m2):
""" 两个位矩阵取取并(即“或”运算) """
matrix = [[] for _ in range(len(m1))]
for i in range(len(m1)):
matrix[i] = [max(x,y) for x, y in zip(m1[i], m2[i])]
return matrix
def matrix_is_comp(m1, m2):
""" 判断两个位矩阵是否互补 """
is_comp = True
done = False
for i in range(len(m1)):
for j in range(len(m1[0])):
if m1[i][j] + m2[i][j] != 1:
is_comp = False
done = True
break
if done:
break
return is_comp
def get_min_plan(n, m, dct_ms, m0):
""" 按元素个数依次枚举 """
for r in range(1, len(dct_ms)+1):
for comb in combinations(dct_ms.keys(), r):
# 1.merge these matrixes
mtx = generate_blank_matrix(n, m)
for idx in comb:
mtx = matrix_max(mtx, dct_ms[idx])
# 2.judge if complement
if matrix_is_comp(mtx, m0):
return list(comb)
return []
# 1.read data
n, m, q = map(int, input().strip().split())
# main matrix
m0 = read_matrix(n)
# plan matrixes
dct_ms = {}
id_m = 0
for _ in range(q):
id_m += 1
dct_ms[id_m] = read_matrix(n)
# 2.compute and print
mtx = generate_blank_matrix(n, m)
if matrix_is_comp(mtx, m0):
# m0 already full
print(0)
else:
# m0 not full
lst_id = get_min_plan(n, m, dct_ms, m0)
if lst_id:
print(len(lst_id))
lst_id.sort()
print(" ".join(map(str, lst_id)))
else:
print(-1)