from sys import stderr, stdout
stderr = stdout
def calc(up):
i0, v0 = up[0]
i1, v1 = up[1]
k = (v1 - v0) // (i1 - i0)
b = v0 - i0 * k
return (k, b)
def main():
n, m = map(int, input().split())
mat = [list(map(int, input().split())) for _ in range(n)]
# print(n, m, *mat, sep="\n", file=stderr)
rec = [[0] * m for _ in range(n)]
yup = [[] for _ in range(n)]
xup = [[] for _ in range(m)]
upd = []
upe = []
def update(y: int, x: int, v: int):
nonlocal upd
# print(y, x, v, file=stderr)
assert v, (y, x, v)
if rec[y][x] == 0:
ryup = yup[y]
rxup = xup[x]
if ryup is not None and len(ryup) < 2:
ryup.append((x, v))
if len(ryup) == 2:
upd.append(("y", y))
if rxup is not None and len(rxup) < 2:
rxup.append((y, v))
if len(rxup) == 2:
upd.append(("x", x))
rec[y][x] = v
else:
assert rec[y][x] == v, (rec[y][x], v)
# initial
for y, row in enumerate(mat):
for x, val in enumerate(row):
if val:
update(y, x, val)
# iterate
while len(upd) > 0:
# print(f'-- BEFORE --', file=stderr)
# print(*rec, sep='\n', file=stderr)
upe.clear()
upd, upe = upe, upd
for c, i in upe:
if c == "y":
# print(c, i, yup[i], file=stderr)
k, b = calc(yup[i])
for x in range(0, m):
update(i, x, k * x + b)
else:
# print(c, i, xup[i], file=stderr)
k, b = calc(xup[i])
for y in range(0, n):
update(y, i, k * y + b)
# print('-- AFTER --', file=stderr)
# print(*rec, sep="\n", file=stderr)
for y, row in enumerate(mat):
for x, val in enumerate(row):
if val == 0 and rec[y][x]:
print(y + 1, x + 1, rec[y][x])
main()
只要某一行(列)有2个元素,就可确定整行(列)。
之后可能使其他行(列)新增元素,需反复,直到不能再确定新的行(列)。
最后与最初状态比较,输出从零变非零的元素。

京公网安备 11010502036488号