Check if it is possible to rearrange rectangles in a non-ascending order of breadths in Python

Sometimes we have a list of rectangles represented by their length and breadth coordinates, and we need to arrange them in non-ascending (non-increasing) order of breadths. Since rectangles can be rotated 90 degrees, we can swap length and breadth to optimize the arrangement.

The key insight is that for each rectangle, we can choose either dimension as the breadth. We need to make optimal choices to create a non-increasing sequence.

Problem Understanding

Given rectangles with dimensions [length, breadth], we want to:

  • Optionally rotate each rectangle (swap dimensions)
  • Arrange them so breadths are in non-increasing order
  • Return True if possible, False otherwise

Algorithm Approach

We use a greedy approach:

  • Start with a very large maximum breadth value
  • For each rectangle, try to use the larger dimension as breadth first
  • If that exceeds our current maximum, try the smaller dimension
  • If neither dimension works, return False
  • Update the maximum to the chosen breadth

Example

Let's trace through the algorithm with sample data ?

def solve(rectangles):
    max_breadth = 99999
    
    for i in range(len(rectangles)):
        length, breadth = rectangles[i][0], rectangles[i][1]
        
        # Try using the larger dimension as breadth first
        if max(length, breadth) <= max_breadth:
            max_breadth = max(length, breadth)
        # If larger dimension doesn't work, try smaller dimension
        elif min(length, breadth) <= max_breadth:
            max_breadth = min(length, breadth)
        # If neither dimension works, arrangement is impossible
        else:
            return False
    
    return True

# Test with example data
rectangles = [[4, 5], [5, 7], [4, 6]]
result = solve(rectangles)
print(f"Input: {rectangles}")
print(f"Can arrange in non-increasing order: {result}")
Input: [[4, 5], [5, 7], [4, 6]]
Can arrange in non-increasing order: True

Step-by-Step Trace

For rectangles [[4, 5], [5, 7], [4, 6]]:

def solve_with_trace(rectangles):
    max_breadth = 99999
    chosen_breadths = []
    
    for i, rect in enumerate(rectangles):
        length, breadth = rect[0], rect[1]
        print(f"Rectangle {i}: [{length}, {breadth}], max_allowed: {max_breadth}")
        
        if max(length, breadth) <= max_breadth:
            chosen = max(length, breadth)
            chosen_breadths.append(chosen)
            max_breadth = chosen
            print(f"  Chose larger dimension: {chosen}")
        elif min(length, breadth) <= max_breadth:
            chosen = min(length, breadth)
            chosen_breadths.append(chosen)
            max_breadth = chosen
            print(f"  Chose smaller dimension: {chosen}")
        else:
            print(f"  Cannot arrange - neither dimension ? {max_breadth}")
            return False, []
    
    print(f"Final breadth sequence: {chosen_breadths}")
    return True, chosen_breadths

rectangles = [[4, 5], [5, 7], [4, 6]]
is_possible, sequence = solve_with_trace(rectangles)
Rectangle 0: [4, 5], max_allowed: 99999
  Chose larger dimension: 5
Rectangle 1: [5, 7], max_allowed: 5
  Chose smaller dimension: 5
Rectangle 2: [4, 6], max_allowed: 5
  Chose smaller dimension: 4
Final breadth sequence: [5, 5, 4]

Testing Different Cases

def test_cases():
    test_data = [
        [[4, 5], [5, 7], [4, 6]],  # Expected: True
        [[3, 4], [1, 2], [5, 6]],  # Expected: False (increasing)
        [[10, 2], [8, 3], [6, 4]], # Expected: True
        [[1, 1], [2, 2], [3, 3]]   # Expected: False
    ]
    
    for i, rectangles in enumerate(test_data):
        result = solve(rectangles)
        print(f"Test case {i+1}: {rectangles} ? {result}")

test_cases()
Test case 1: [[4, 5], [5, 7], [4, 6]] ? True
Test case 2: [[3, 4], [1, 2], [5, 6]] ? False
Test case 3: [[10, 2], [8, 3], [6, 4]] ? True
Test case 4: [[1, 1], [2, 2], [3, 3]] ? False

Key Points

  • Greedy Strategy: Always try the larger dimension first for maximum flexibility
  • Time Complexity: O(n) where n is the number of rectangles
  • Space Complexity: O(1) excluding input storage
  • Non-ascending: Means breadths can be equal or decreasing (? relationship)

Conclusion

The greedy algorithm efficiently determines if rectangles can be arranged in non-increasing breadth order by optimally choosing orientations. The key insight is trying the larger dimension first to maintain maximum flexibility for subsequent rectangles.

Updated on: 2026-03-25T15:13:11+05:30

196 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements