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

โปรแกรมหาจำนวน Swap น้อยที่สุดจัด Binary Grid ให้บน Diagonal เป็น 0 ด้วย Python

Binary matrix n x n สลับแถวติดกันได้ หา swaps น้อยที่สุดทำให้ทุกค่าบน main diagonal (i > j) เป็น 0 กลยุทธ์: หา rightmost 1 ของแต่ละแถว (m[i]) แล้ว greedy ย้ายแถวที่ m[i] <= allowed position ไปด้านบน นับ swaps

อัลกอริทึม

  1. m[i] = จำนวนคอลัมน์จากขวาสุดถึง rightmost 1 ของแถว i (ถ้าไม่มี 1 ให้ m[i]=n)
  2. สำหรับแต่ละแถวเป้าหมาย i (0-indexed): allowed = n - i - 1
  3. หาแถว j >= i ที่ m[j] <= allowed ใกล้ที่สุด
  4. Swap แถว j ขึ้นมาตำแหน่ง i (ใช้ swaps = j - i) shift แถวระหว่างลงมา
  5. ถ้าไม่เจอ: return -1

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


def solve(matrix):
    n = len(matrix)
    m = [n] * n
    for i in range(n):
        for j in range(n-1, -1, -1):
            if matrix[i][j] == 1:
                m[i] = n - j - 1
                break
    t, ans = 0, 0
    for i in range(n):
        t += 1
        flag = False
        for j in range(i, n):
            if m[j] >= n - t:
                ans += j - i
                flag = True
                break
        if not flag:
            return -1
        m[i+1:j+1] = m[i:j]
    return ans

matrix = [[0,1,0], [0,1,1], [1,0,0]]
print(solve(matrix))  # Output: 2

อินพุต/เอาต์พุต

Input: [[0,1,0],[0,1,1],[1,0,0]]
Output: 2