ในปัญหานี้ เราได้รับแผ่นเมทริกซ์สี่เหลี่ยมจัตุรัส[][] ขนาด 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