假設我們有一個二進制2D矩陣,現在我們必須找到所有用0填充的矩形的起點和終點。我們必須牢記,矩形是分開的,彼此之間不接觸,但是它們可以接觸陣列邊界。僅包含單個元素的矩形也是可能的。
所以,如果輸入像-1011101
1101111
1011001
1011001
1011011
1010000
1110001
1011101
那么輸出將是[[0,1,0,1],[0,5,0,5],[1,2,1,2],[2,3,2,4],[3,1 ,5、1],[3、4、6、5],[5、3、6、5],[7、1、7、1],[7、5、7、5]]
為了解決這個問題,我們將遵循以下步驟-定義一個函數find_rect()。這將需要i,j,a,輸出,索引
x:=行數
y:=列數
flag_col:= 0
flag_row:= 0
對于范圍i至x的m在輸出[索引]的末尾插入n
在輸出[索引]的末尾插入n-1
在輸出[索引]的末尾插入m在輸出[索引]的末尾插入m-1
如果a [m,n]等于1,則
a [m,n]:= 5flag_col:= 1
打破
沒做什么flag_row:= 1
打破
如果a [m,j]等于1,則
如果a [m,j]與5相同,則
對于j到y范圍內的n
如果flag_row與1相同,則
除此以外,
如果flag_col與1相同,則
除此以外,
從主要方法中,執行以下操作-
n:=一個的大小
op:=一個新列表
idx:= -1
對于0到n范圍內的i,執行如果a [i,j]等于0,則
將[i,j]插入op
idx:= idx + 1
find_rect(i,j,a,op,idx)
對于范圍為0到a [0]大小的j,執行
顯示操作
范例程式碼
讓我們看下面的實現以更好地理解-def?find_rect(i,j,a,output,index):
x?=?len(a)
y?=?len(a[0])
flag_col?=?0
flag_row?=?0
for?m?in?range(i,x):
if?a[m][j]?==?1:
flag_row?=?1
break
if?a[m][j]?==?5:
pass
for?n?in?range(j,?y):
if?a[m][n]?==?1:
flag_col?=?1
break
a[m][n]?=?5
if?flag_row?==?1:
output[index].append(?m-1)
else:
output[index].append(m)
if?flag_col?==?1:
output[index].append(n-1)
else:
output[index].append(n)
def?get_coord(a):
n?=?len(a)
op?=?[]
idx?=?-1
for?i?in?range(0,n):
for?j?in?range(0,?len(a[0])):
if?a[i][j]?==?0:
op.append([i,?j])
idx?=?idx?+?1
find_rect(i,?j,?a,?op,?idx)
print?(op)
tests?=?[[1,?0,?1,?1,?1,?0,?1],
[1,?1,?0,?1,?1,?1,?1],
[1,?1,?1,?0,?0,?1,?1],
[1,?0,?1,?1,?0,?0,?1],
[1,?0,?1,?1,?0,?1,?1],
[1,?0,?1,?0,?0,?0,?0],
[1,?1,?1,?0,?0,?0,?1],
[1,?0,?1,?1,?1,?0,?1]]
get_coord(tests)
輸入值[[1,?0,?1,?1,?1,?0,?1],
[1,?1,?0,?1,?1,?1,?1],
[1,?1,?1,?0,?0,?1,?1],
[1,?0,?1,?1,?0,?0,?1],
[1,?0,?1,?1,?0,?1,?1],
[1,?0,?1,?0,?0,?0,?0],
[1,?1,?1,?0,?0,?0,?1],
[1,?0,?1,?1,?1,?0,?1]]
輸出結果[[0,?1,?0,?1],?[0,?5,?0,?5],?[1,?2,?1,?2],?[2,?3,?2,?4],?[3,?1,?5,?1],?[3,?4,?6,?5],?[5,?3,?6,?5],?[7,?1,?7,?1],?[7,?5,?7,?5]]