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

โปรแกรมตรวจสอบว่าเติมตาราง Latin Square ได้หรือไม่ใน Python

สมมติว่าเรามีเมทริกซ์ n×n ที่มีค่าจาก 0 ถึง n โดย 0 แทนช่องว่าง เราต้องตรวจสอบว่าเราสามารถเติมช่องว่างได้หรือไม่ เพื่อให้แต่ละแถวและแต่ละคอลัมน์มีตัวเลข 1 ถึง n ครั้งละครั้ง (Latin Square)

ตัวอย่างเช่น เมทริกซ์:

0 0 2
2 0 1
1 2 3
สามารถเติมได้เป็น:
3 1 2
2 3 1
1 2 3
ดังนั้นผลลัพธ์คือ True

ขั้นตอนการแก้ปัญหา (Backtracking)

  1. find_empty_cell(matrix, n): หาช่องที่มีค่า 0 คืนค่า (i, j) หรือ (-1, -1) หากไม่มี
  2. is_feasible(matrix, i, j, x): ตรวจสอบว่าวาง x ที่ (i, j) ได้หรือไม่ (ไม่ซ้ำในแถวและคอลัมน์)
  3. is_complete(matrix, n): ตรวจสอบว่าเมทริกซ์สมบูรณ์และถูกต้องหรือไม่
  4. ฟังก์ชันหลัก solve(matrix):
    • หาช่องว่าง ถ้าไม่มี ให้ตรวจสอบ is_complete
    • ลองวาง x = 1 ถึง n หาก is_feasible ให้วางและเรียก solve() recursive
    • หากล้มเหลว ให้ backtrack (ล้างค่าเป็น 0)
    • คืนค่า True/False

ตัวอย่างโค้ด Python

class Solution:
    def solve(self, matrix):
        n = len(matrix)
        
        def find_empty_cell(matrix, n):
            for i in range(n):
                for j in range(n):
                    if matrix[i][j] == 0:
                        return (i, j)
            return (-1, -1)
        
        def is_feasible(matrix, i, j, x):
            if x in matrix[i]:
                return False
            if x in [row[j] for row in matrix]:
                return False
            return True
        
        def is_complete(matrix, n):
            for row in matrix:
                if set(row) != set(range(1, n + 1)):
                    return False
            for col in range(n):
                if set(row[col] for row in matrix) != set(range(1, n + 1)):
                    return False
            return True
        
        (i, j) = find_empty_cell(matrix, n)
        if (i, j) == (-1, -1):
            return is_complete(matrix, n)
        
        for x in range(1, n + 1):
            if is_feasible(matrix, i, j, x):
                matrix[i][j] = x
                if self.solve(matrix):
                    return True
                matrix[i][j] = 0
        
        return False

ob = Solution()
matrix = [
    [0, 0, 2],
    [2, 0, 1],
    [1, 2, 3]
]
print(ob.solve(matrix))  # Output: True

อินพุต

matrix = [[0, 0, 2], [2, 0, 1], [1, 2, 3]]

เอาต์พุต

True