Vấn đề này chưa được xác định rõ. Vì bạn đã cung cấp một ví dụ đơn giản, đơn giản, bạn đã bỏ lỡ một số khả năng logic và các trường hợp góc quan trọng ở đây (hoặc, bạn chỉ không loại trừ chúng một cách rõ ràng). Chẳng hạn, vì bạn không đề cập đến ứng dụng được đề xuất cho việc này, nên bạn đã không chỉ định điều quan trọng hơn: Chia toàn bộ bản đồ thành các hình chữ nhật độc quyền có diện tích càng lớn càng tốt (Vấn đề đóng gói, có tùy ý số lượng giải pháp), hoặc đơn giản là nhận các hình chữ nhật cạnh phù hợp trong mỗi x và y, như bạn dường như ngụ ý ở trên. Tôi giả sử sau.
Hãy xem xét trường hợp bạn điền vào mỗi 4 ô xếp ngay lập tức ở các góc của bitmask hình chữ "dấu cộng" mà bạn đã vẽ ở trên ([2, 2] là trên cùng). Bây giờ các hình chữ nhật tối ưu là gì? Chỉ xem xét các cột, bạn sẽ thích hẹp hơn, các đường dài hơn với các cạnh mỏng hơn sang hai bên, hoặc hình vuông lớn hơn, rộng hơn mà bây giờ có thể được tìm thấy ở giữa hình ảnh, với các hình vuông ở trên và dưới?
Dù sao, giả sử các nhóm phù hợp với cạnh dài nhất có thể, hãy coi đây là giải pháp thử đầu tiên:
- Chia bitmask thành các cột. Mỗi cột bắt đầu ở một số giá trị y0 và kết thúc ở một giá trị khác y1. Lưu trữ mỗi cột dưới dạng một tuple (y0, y1) trong danh sách.
- Cột: Đánh giá danh sách. Tìm nơi các bộ dữ liệu liền kề có cùng y0 VÀ y1 giữa chúng (ví dụ: cột A bắt đầu tại y0 = 1 và kết thúc tại y1 = 4; cột B cũng vậy). Chừng nào mỗi cột liên tiếp DOES có những cái này giống nhau, hãy tăng chiều rộng của hình chữ nhật bạn đã tạo để thể hiện chúng, bằng một. Ngay sau khi họ KHÔNG, kết thúc hình chữ nhật này và lưu trữ nó, và tạo một cái mới cho bất kỳ nhóm cột tiếp theo nào.
Lặp lại cả hai bước trên cho các hàng, chính xác như đối với các cột (thay vào đó sử dụng x0 và x1 và một danh sách riêng).
Bây giờ bạn sẽ có một số danh sách các hình chữ nhật có cạnh rõ ràng. Tuy nhiên, chúng có thể không tối ưu cho ứng dụng của bạn; nếu đây là trường hợp, bạn sẽ cần một hệ thống heuristic cho phép đóng gói hiệu quả hơn. Xem vấn đề đóng gói để biết thêm.