Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมหาจำนวนเกาะจากจุดที่ปล่อยใน Python . ไม่ได้


สมมติว่าเรามีเมทริกซ์ไบนารี โดยที่ 1 หมายถึงดิน และ 0 หมายถึงน้ำ จากดินแดนใด ๆ เราสามารถเลื่อนขึ้น ลง ซ้ายหรือขวา แต่ไม่เป็นแนวทแยงไปยังเซลล์พื้นดินอื่นหรือออกจากเมทริกซ์ เราต้องหาจำนวนเซลล์ภาคพื้นดินที่เราไม่สามารถออกจากเมทริกซ์ได้

ดังนั้นหากอินพุตเป็นแบบ

0 0 0 1
0 1 1 0
0 1 1 0
0 0 0 1

จากนั้นผลลัพธ์จะเป็น 4 เนื่องจากมีสี่เหลี่ยมดิน 4 ช่องอยู่ตรงกลางซึ่งเราไม่สามารถเดินออกจากเมทริกซ์ได้

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • q :=รายการคู่ (i, j) สำหรับแต่ละแถว i และคอลัมน์เมื่อ matrix[i, j] คือ land i และ j เป็นดัชนีเส้นขอบ
  • idx :=0
  • สำหรับแต่ละคู่ (x, y) ใน q ทำ
    • เมทริกซ์[x, y] :=0
  • ในขณะที่ idx <ขนาดของ q ทำ
    • x, y :=q[idx]
    • สำหรับแต่ละ (dx, dy) ใน [(-1, 0) ,(0, -1) ,(0, 1) ,(1, 0) ] ทำ
      • nx :=x + dx
      • ny :=y + dy
      • ถ้า 0 <=nx <จำนวนแถวของเมทริกซ์และ 0 <=ny <จำนวนคอลัมน์ของเมทริกซ์[nx] และเมทริกซ์[nx, ny] คือ 1 ดังนั้น
        • เมทริกซ์[nx, ny] :=0
        • แทรก (nx, ny) ที่ส่วนท้ายของ q
    • idx :=idx + 1
  • ส่งคืนผลรวมขององค์ประกอบทั้งหมดของเมทริกซ์

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

def solve(matrix):
   q = [(i, j) for i in range(len(matrix)) for j in range(len(matrix[i])) if matrix[i][j] and (i == 0 or i == len(matrix) - 1 or j == 0 or j == len(matrix[i]) - 1)]
   idx = 0
   for x, y in q:
      matrix[x][y] = 0
   while idx < len(q):
      x, y = q[idx]
      for dx, dy in [(-1, 0), (0, -1), (0, 1), (1, 0)]:
         nx, ny = x + dx, y + dy
         if 0 <= nx < len(matrix) and 0 <= ny < len(matrix[nx]) and matrix[nx][ny]:
            matrix[nx][ny] = 0
            q.append((nx, ny))
      idx += 1
   return sum(sum(row) for row in matrix)

matrix = [
[0, 0, 0, 1],
[0, 1, 1, 0],
[0, 1, 1, 0],
[0, 0, 0, 1]
]
print(solve(matrix))

อินพุต

[
[0, 0, 0, 1],
[0, 1, 1, 0],
[0, 1, 1, 0],
[0, 0, 0, 1]
]

ผลลัพธ์

4