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

ค้นหาความยาวเส้นทางสูงสุดในเมทริกซ์ไบนารีใน Python


ในปัญหานี้ เราได้รับแผ่นเมทริกซ์สี่เหลี่ยมจัตุรัส[][] ขนาด m X n โดยแต่ละองค์ประกอบเป็น 0 หรือ 1 หากองค์ประกอบมีค่า 1 แสดงว่าเชื่อมต่อแล้ว หากค่าเป็น 0 แสดงว่า ไม่ได้เชื่อมต่อ งานของเราคือการหาความยาวเส้นทางสูงสุดในเมทริกซ์ไบนารี

คำอธิบายปัญหา − ในการแก้ปัญหา เราจำเป็นต้องค้นหาเส้นทางความยาวที่ใหญ่ที่สุดบนเมทริกซ์ ซึ่งหมายถึงองค์ประกอบทั้งหมด 1 รายการในเมทริกซ์ ก่อนหาเส้นทาง เราจะแปลงค่า 0 เป็น 1 อย่างมากที่สุด

มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน

อินพุต

mat[][] = {{1, 0},
{0, 1}}

ผลลัพธ์

3

คำอธิบาย

We can convert 0 at index (0, 1) or (1, 0) to maximise the path length.

แนวทางการแก้ปัญหา

วิธีแก้ปัญหาง่ายๆ คือ การหาความยาวหลังจากแปลงค่า 0 เป็น 1 แต่ละตัว เราจะใช้การค้นหาเชิงลึกก่อนเพื่อค้นหาความยาวของเส้นทาง จากนั้นคืนค่าสูงสุดของความยาวเส้นทางทั้งหมด

วิธีแก้ปัญหาที่มีประสิทธิภาพคือการกำจัดความจำเป็นในการแปลงหลาย ๆ ครั้งและจัดการกับสิ่งที่ให้โซลูชันที่มีแนวโน้มดีที่สุด เราจะพบกลุ่มที่การเปลี่ยน 0 เป็น 1 จะคืนค่าเส้นทางที่ยาวที่สุด

โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา

ตัวอย่าง

def FindNeighbor(R, C, N):
   for nr, nc in (((R - 1), C), ( (R + 1) , C), (R, (C - 1) ), (R, (C + 1) )):
      if 0 <= nr < N and 0 <= nc < N:
         yield nr, nc

def DFSTraversal(R, C, index, mat, N):
   maxLen = 1
   mat[R][C] = index
   for nr, nc in FindNeighbor(R, C, N):
      if mat[nr][nc] == 1:
         maxLen += DFSTraversal(nr, nc, index)

   return maxLen


def findLargestPath(mat):

   N = len(mat)
   maxPath = {}
   index = 2

   for i in range(N):
      for j in range(N):
         if mat[i][j] == 1:
            maxPath[index] = DFSTraversal(i, j, index, mat, N)
            index += 1

   maxPathLen = max(maxPath.values() or [0])

   for i in range(N):
      for j in range(N):
         if mat[i][j] == 0:
            seen = {mat[nr][nc] for nr, nc in FindNeighbor(i, j, N) if mat[nr][nc] > 1}
            maxPathLen = max(maxPathLen, 1 + sum(maxPath[i] for i in seen))

   return maxPathLen
I = [[1, 0], [0, 1]]
print("The length of largest path is " + str(findLargestPath(I)))

ผลลัพธ์

The length of largest path is 3