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

โปรแกรมค้นหาเมทริกซ์ที่ถูกต้องที่ให้ผลรวมแถวและคอลัมน์ใน Python


สมมติว่าเรามีสองอาร์เรย์ rowSum และ colSum ที่มีค่าไม่เป็นลบ โดยที่ rowSum[i] มีผลรวมขององค์ประกอบในแถว ith และ colSum[j] มีผลรวมขององค์ประกอบในคอลัมน์ jth ของเมทริกซ์ 2 มิติ เราต้องหาเมทริกซ์ใดๆ ที่มีค่าขนาดไม่เป็นลบ (ขนาด rowSum x ขนาด colSum) ที่ตรงกับค่า rowSum และ colSum ที่กำหนด

ดังนั้น หากอินพุตเป็นเหมือน rowSum =[13,14,12] colSum =[9,13,17] ผลลัพธ์จะเป็น

9 4 0
0 9 5
0 0 12

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

  • เมทริกซ์ :=สร้างเมทริกซ์ว่าง
  • เข้าชมแล้ว :=ชุดใหม่
  • กำหนดฟังก์ชัน maximum() นี่จะใช้เวลา r,c
  • min_total :=อินฟินิตี้
  • ประเภท :=สตริงว่าง
  • สำหรับฉันในช่วง 0 ถึงขนาด r - 1 ทำ
    • ถ้า r[i]
    • ดัชนี :=ผม
    • ประเภท :='แถว'
    • min_total :=r[i]
  • สำหรับ i ในช่วง 0 ถึงขนาด c - 1 ให้ทำ
    • ถ้า c[i]
    • min_total :=c[i]
    • type :='col'
    • ดัชนี :=ผม
  • ถ้าประเภทเหมือนกับ 'row' แล้ว
    • r[index] :=อินฟินิตี้
    • สำหรับ i ในช่วง 0 ถึงขนาด c - 1 ให้ทำ
      • ถ้า c[i] ไม่เหมือนกับอินฟินิตี้และ c[i]>=min_total แล้ว
        • c[i] :=c[i] - min_total
        • เมทริกซ์[ดัชนี, i] :=min_total
        • ออกมาจากลูป
  • ถ้าประเภทเหมือนกับ 'col' แล้ว
    • c[index] :=อินฟินิตี้
    • สำหรับฉันในช่วง 0 ถึงขนาด r - 1 ทำ
      • ถ้า r[i] ไม่เหมือนกับอินฟินิตี้และ r[i]>=min_total แล้ว
        • r[i] :=r[i] - min_total
        • เมทริกซ์[i, ดัชนี] :=min_total
        • ออกมาจากลูป
  • ใส่คู่ (ดัชนี,ประเภท) เข้าที่เข้าชมแล้ว
  • จากวิธีหลัก ให้ทำดังนี้ -
  • ในขณะที่ขนาดของการเยี่ยมชมไม่เหมือนกับขนาดของ r +len(c) do
  • ขั้นต่ำ(r,c)
  • เมทริกซ์ผลตอบแทน
  • ตัวอย่าง

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

    def solve(r, c):
       matrix = [[0]*len(c) for _ in range(len(r))]
       visited = set()
    
       def minimum(r,c):
          min_total = float('inf')
       
          type = ''
          for i in range(len(r)):
             if(r[i] < min_total):
                index = i
                type = 'row'
                min_total = r[i]
    
          for i in range(len(c)):
             if(c[i] < min_total):
                min_total = c[i]
                type = 'col'
                index = i
    
          if(type == 'row'):
             r[index] = float('inf')
    
             for i in range(len(c)):
                if(c[i] != float('inf') and c[i] >= min_total):
                   c[i] -= min_total
                   matrix[index][i] = min_total
                   break
    
          if(type == 'col'):
             c[index] = float('inf')
             for i in range(len(r)):
                if(r[i] != float('inf') and r[i] >= min_total):
                   r[i] -= min_total
                   matrix[i][index] = min_total
                   break
    
          visited.add((index,type))
    
       while len(visited) != len(r)+len(c):
          minimum(r,c)
    
       return matrix
    
    rowSum = [13,14,12]
    colSum = [9,13,17]
    print(solve(rowSum, colSum))

    อินพุต

    [13,14,12], [9,13,17]

    ผลลัพธ์

    [[9, 4, 0], [0, 9, 5], [0, 0, 12]]