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

โปรแกรมนับจำนวนเกาะที่ทับซ้อนกันในสองแผนที่ใน Python


สมมติว่าเรามีเมทริกซ์ไบนารีสองตัวคือ 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 เพราะเกาะที่ทับซ้อนกันคือ

1 0 1
1 0 0
1 0 1

จึงมีเกาะสองเกาะทับซ้อนกัน

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

  • r :=จำนวนแถวของ mat1
  • c :=จำนวนคอลัมน์ของ mat1
  • last_row :=r - 1
  • last_col :=c - 1
  • กำหนดฟังก์ชัน mark() นี่จะใช้เวลา i, j
  • mat1[i, j] :=0
  • mat2[i, j] :=0
  • ถ้าฉันไม่ใช่ศูนย์และ (mat1[i - 1, j] หรือ mat2[i - 1, j] อันใดอันหนึ่งไม่ใช่ศูนย์) ดังนั้น
    • เครื่องหมาย(i - 1, j)
  • ถ้า j ไม่ใช่ศูนย์และ (mat1[i, j - 1] หรือ mat2[i, j - 1] อันใดไม่ใช่ศูนย์) ดังนั้น
    • เครื่องหมาย(i, j - 1)
  • ถ้า j
  • เครื่องหมาย(i, j + 1)
  • ถ้าฉัน
  • เครื่องหมาย(i + 1, j)
  • จากวิธีหลัก ให้ทำดังต่อไปนี้ −
  • สำหรับฉันในช่วง 0 ถึง r - 1 ทำ
    • สำหรับ j ในช่วง 0 ถึง c - 1 ทำ
      • ถ้า mat1[i, j] ไม่เหมือนกับ mat2[i, j] แล้ว
        • เครื่องหมาย (i, j)
  • หมู่เกาะ :=0
  • สำหรับฉันในช่วง 0 ถึง r - 1 ทำ
    • สำหรับ j ในช่วง 0 ถึง c - 1 ทำ
      • ถ้า mat1[i, j] ไม่ใช่ศูนย์ แล้ว
        • เกาะ :=เกาะ + 1
        • เครื่องหมาย (i, j)
  • คืนเกาะ
  • ตัวอย่าง

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

    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))

    อินพุต

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

    ผลลัพธ์

    2