คำอธิบายปัญหา
สมมติว่าเรามีเมทริกซ์ไบนารีสองอันคือ mat1 และ mat2 โดยที่ 1 แทนที่ดิน และ 0 แทนน้ำ กลุ่มของ 1 (ที่ดิน) ที่ถูกล้อมรอบด้วยน้ำเรียกว่า "เกาะ" เราต้องการหาจำนวนเกาะที่มีอยู่ในทั้ง mat1 และ mat2 ที่พิกัดที่ตรงกันทุกประการ
ตัวอย่าง
หากอินพุตเป็นดังนี้:
mat1 = [[1, 0, 1],
[1, 0, 0],
[1, 0, 0]]
mat2 = [[1, 0, 1],
[1, 0, 0],
[1, 0, 1]]
เอาต์พุทจะเป็น 2 เนื่องจากมีเกาะที่ทับซ้อนกันสองแห่ง (คอลัมน์แรกและแถวแรก-คอลัมน์ที่สาม)
ขั้นตอนการแก้ปัญหา
- กำหนด
r= จำนวนแถวของmat1,c= จำนวนคอลัมน์ - สร้างฟังก์ชัน
mark(i, j)เพื่อทำเครื่องหมายเซลล์ที่เยี่ยมชมแล้ว:- ตั้งค่า
mat1[i][j] = mat2[i][j] = 0 - ตรวจสอบเพื่อนบน 4 ทิศทาง (บน, ล่าง, ซ้าย, ขวา) หากเป็นที่ดินในเมทริกซ์ใดเมทริกซ์หนึ่ง ให้เรียก
markแบบรีเคอร์ซีฟ
- ตั้งค่า
- ลูปผ่านทุกเซลล์: หาก
mat1[i][j] != mat2[i][j]ให้เรียกmark(i, j)เพื่อกำจัดเกาะที่ไม่ตรงกัน - นับเกาะที่เหลือใน
mat1(ซึ่งจะตรงกับmat2แล้ว) โดยใช้markอีกครั้ง
การตนการทำงาน (Python)
def solve(mat1, mat2):
r = len(mat1)
c = len(mat1[0])
last_row = r - 1
last_col = c - 1
def mark(i, j):
mat1[i][j] = mat2[i][j] = 0
if i and (mat1[i - 1][j] or mat2[i - 1][j]):
mark(i - 1, j)
if j and (mat1[i][j - 1] or mat2[i][j - 1]):
mark(i, j - 1)
if j < last_col and (mat1[i][j + 1] or mat2[i][j + 1]):
mark(i, j + 1)
if i < last_row and (mat1[i + 1][j] or mat2[i + 1][j]):
mark(i + 1, j)
# กำจัดเกาะที่ไม่ตรงกัน
for i in range(r):
for j in range(c):
if mat1[i][j] != mat2[i][j]:
mark(i, j)
islands = 0
# นับเกาะที่เหลือ (ซึ่งตรงกันแล้ว)
for i in range(r):
for j in range(c):
if mat1[i][j]:
islands += 1
mark(i, j)
return islands
mat1 = [[1, 0, 1], [1, 0, 0], [1, 0, 1]]
mat2 = [[1, 0, 1], [1, 0, 0], [1, 0, 0]]
print(solve(mat1, mat2)) # Output: 2
อินพุต / เอาต์พุต
Input: [[1, 0, 1], [1, 0, 0], [1, 0, 1]], [[1, 0, 1], [1, 0, 0], [1, 0, 0]] Output: 2