สมมติว่าเรามีเมทริกซ์ 2 มิติแบบไบนารี ตอนนี้เราต้องหาจุดเริ่มต้นและจุดสิ้นสุดของสี่เหลี่ยมทั้งหมดที่มี 0 เราต้องจำไว้ว่าสี่เหลี่ยมถูกแยกออกจากกันและไม่สัมผัสกัน แต่สามารถสัมผัสขอบเขตอาร์เรย์ได้ สี่เหลี่ยมที่มีองค์ประกอบเดียวก็เป็นไปได้เช่นกัน
ดังนั้นหากอินพุตเป็น −
1 | 0 | 1 | 1 | 1 | 0 | 1 |
1 | 1 | 0 | 1 | 1 | 1 | 1 |
1 | 0 | 1 | 1 | 0 | 0 | 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]]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดฟังก์ชัน find_rect() นี่จะใช้เวลา i,j,a,output,index
- x :=จำนวนแถว
- y :=จำนวนคอล
- flag_col :=0
- flag_row :=0
- สำหรับ m ในช่วง i ถึง x ทำ
- ถ้า a[m, j] เหมือนกับ 1 แล้ว
- flag_row :=1
- แตก
- ถ้า a[m, j] เท่ากับ 5 แล้ว
- ไม่ทำอะไรเลย
- สำหรับ n ในช่วง j ถึง y ทำ
- ถ้า a[m, n] เหมือนกับ 1 แล้ว
- flag_col :=1
- แตก
- a[m, n] :=5
- ถ้า a[m, n] เหมือนกับ 1 แล้ว
- ถ้า flag_row เหมือนกับ 1 แล้ว
- แทรก m-1 ที่ส่วนท้ายของเอาต์พุต[index]
- มิฉะนั้น
- แทรก m ที่ส่วนท้ายของเอาต์พุต[index]
- ถ้า flag_col เหมือนกับ 1 แล้ว
- แทรก n-1 ที่ส่วนท้ายของเอาต์พุต[index]
- มิฉะนั้น
- ใส่ n ที่ส่วนท้ายของเอาต์พุต[index]
- ถ้า a[m, j] เหมือนกับ 1 แล้ว
- จากวิธีหลัก ให้ทำดังต่อไปนี้ −
- n :=ขนาดของ a
- op :=รายการใหม่
- idx :=-1
- สำหรับ i ในช่วง 0 ถึง n ให้ทำ
- สำหรับ j ในช่วง 0 ถึงขนาด a[0] ทำ
- ถ้า a[i, j] เหมือนกับ 0 แล้ว
- แทรก [i,j] ลงใน op
- idx :=idx + 1
- find_rect(i, j, a, op, idx)
- ถ้า a[i, j] เหมือนกับ 0 แล้ว
- สำหรับ j ในช่วง 0 ถึงขนาด a[0] ทำ
- ตัวเลือกการแสดงผล
โค้ดตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
def find_rect(i,j,a,output,index):x =len(a) y =len(a[0]) flag_col =0 flag_row =0 สำหรับ m ในช่วง (i,x):ถ้า [m][j] ==1:flag_row =1 break if a[m][j] ==5:ส่งผ่านสำหรับ n ในช่วง (j, y):if a[m][n] ==1:flag_col =1 แบ่ง a[m][n] =5 ถ้า flag_row ==1:output[index].append( m-1) อื่น:output[index].append(m) if flag_col ==1:output[index] .append(n-1) อื่น:output[index].append(n)def get_coord(a):n =len(a) op =[] idx =-1 for i in range(0,n):for j ในช่วง(0, len(a[0])):ถ้า a[i][j] ==0:op.append([i, j]) idx =idx + 1 find_rect(i, j, a, op , idx) พิมพ์ (op) การทดสอบ =[[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(ทดสอบ)ก่อน>อินพุต
<ก่อนหน้า>[[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]]