Giới thiệu
Có một ngôi làng nhỏ không có gì ngoài vài ngôi nhà và những cánh đồng trống trải. Các quan chức địa phương muốn chia làng thành nhiều lô để mỗi lô chứa chính xác một ngôi nhà, và đường viền của các lô tạo thành một mạng lưới đường thẳng đẹp. Nhiệm vụ của bạn là xác định xem điều này là có thể.
Nhiệm vụ
Đầu vào của bạn là một mảng 2D hình chữ nhật của các bit; 1 đại diện cho một ngôi nhà và 0 một trường trống. Kích thước của nó sẽ có ít nhất 1 × 1 và nó sẽ chứa ít nhất một 1. Bạn có thể lấy đầu vào ở bất kỳ định dạng hợp lý nào (danh sách các số nguyên lồng nhau, danh sách các chuỗi, chuỗi nhiều dòng, v.v.).
Chương trình của bạn sẽ xác định xem mảng có thể được chia thành các ô lưới bằng cách sử dụng các đường thẳng và ngang thẳng để mỗi ô lưới chứa chính xác một 1. Các ô lưới có thể có kích thước và hình dạng khác nhau, mặc dù chúng sẽ luôn có hình chữ nhật. Các dòng phải chạy từ một cạnh của mảng đến cạnh đối diện.
Ví dụ, sau đây là một phân chia hợp lệ của một mảng:
00|0010|01|1
01|0000|00|0
--+----+--+-
00|0000|00|1
01|0010|01|0
--+----+--+-
01|1000|10|1
trong khi cách chia sau không hợp lệ, vì có các ô lưới không có 1 hoặc nhiều hơn 1:
00|0010|01|1
--+----+--+-
01|0000|00|0
00|0000|00|1
01|0010|01|0
--+----+--+-
00|1000|10|1
Nếu một phân chia hợp lệ tồn tại, bạn sẽ đưa ra một giá trị trung thực và nếu không thì là một giá trị giả.
Quy tắc và tính điểm
Bạn có thể viết một chương trình đầy đủ hoặc một chức năng. Số byte thấp nhất sẽ thắng.
Các trường hợp thử nghiệm
[[1]] -> True
[[0,1],[1,0]] -> True
[[1,1],[1,0]] -> False
[[1,0,1],[0,1,0]] -> True
[[1,0],[0,1],[0,1]] -> True
[[1,0,0],[0,0,1],[0,1,1]] -> True
[[1,1,1],[1,1,1],[1,1,1]] -> True
[[1,0,1],[0,1,0],[1,0,0]] -> True
[[1,0,0],[1,0,0],[0,1,1]] -> False
[[0,0,0,0,1],[1,0,0,1,0],[0,0,0,1,0]] -> False
[[0,0,1,0,1],[0,0,0,1,0],[0,0,0,0,0]] -> True
[[1,1,0,0,0],[0,0,0,0,0],[1,0,1,0,0]] -> True
[[1,1,0,1,1],[0,1,0,1,1],[1,0,0,0,0]] -> True
[[0,0,0,0,0,0,0],[0,1,1,1,0,1,0],[0,1,0,0,1,0,0],[0,0,0,0,0,0,1],[0,0,1,0,0,0,1],[1,1,0,1,1,0,0]] -> False
[[1,1,0,0,0,0,0],[1,0,1,1,0,1,0],[0,0,0,0,1,0,0],[0,1,0,1,1,0,0],[1,0,0,0,1,1,0],[0,0,0,0,0,1,0]] -> False
[[0,1,0,1,1,1,0],[0,0,0,0,1,0,0],[0,0,0,0,0,0,0],[1,0,0,1,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,1]] -> True
[[0,1,0,0,1,0,1],[1,0,0,0,1,0,1],[0,0,1,0,1,0,1],[1,0,0,0,1,1,0],[0,0,0,1,1,1,0],[0,1,0,0,1,0,1]] -> True
[[0,1,0,0,1,0,0,1,0],[0,0,0,0,1,1,0,1,0],[1,1,0,0,1,0,0,0,0],[0,0,1,0,1,0,1,0,0],[0,0,1,0,1,0,1,0,0],[0,1,0,0,0,1,0,0,1],[0,1,0,0,0,0,1,0,0]] -> False
[[1,0,1,0,0,1,1,0,1],[0,1,1,0,0,1,1,0,1],[1,0,0,0,0,1,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,1,0,0,0,0,1,1],[0,1,1,0,1,0,1,0,1],[1,0,1,0,0,1,1,0,1]] -> True
[[1, 0, 1], [0, 1, 0], [1, 0, 0]]
Đó là ma trận 3x3 duy nhất mà phương pháp mới của tôi đã thất bại.