Polystrips là tập hợp con của đa giác tuân theo các quy tắc sau:
- mỗi mảnh bao gồm 1 hoặc nhiều ô
- không có tế bào nào có thể có nhiều hơn hai hàng xóm
- các tế bào không được bao quanh một lỗ
Đa giác tự do là khác biệt khi không có sự biến đổi cứng nhắc (dịch, xoay, phản xạ hoặc phản xạ trượt) của một số khác (các mảnh có thể được nhặt và lật lên). Dịch, xoay, phản xạ hoặc lướt qua phản ánh một polyomino tự do không thay đổi hình dạng của nó ( Wikipedia )
Ví dụ, có 30 heptastrips miễn phí (polystrips có chiều dài 7). Dưới đây là tất cả chúng, được đóng gói thành một lưới 14x15.
Tín dụng hình ảnh: Miroslav Vicher
Mục tiêu
Viết chương trình / hàm lấy một số nguyên dương n
làm đầu vào và liệt kê các đa thức tự do riêng biệt n
.
n = 1 -> 1 (Một hình vuông)
n = 2 -> 1 (Chỉ có một 2 polystrip có thể được tạo thành từ 2 hình vuông)
n = 3 -> 2 (Một hình gồm 3 hình vuông được nối thành một dòng và hình kia có hình chữ L)
n = 4 -> 3 (Một hình thẳng, một hình chữ L và một hình chữ Z)
. . .
Các trường hợp thử nghiệm:
n polystrips
1 1
2 1
3 2
4 3
5 7
6 13
7 30
8 64
9 150
10 338
11 794
12 1836
13 4313
14 10067
15 23621
Chấm điểm
Đây là mã golf , vì vậy mã ngắn hơn là tốt hơn. Tôi sẽ đánh giá rất cao những giải thích chi tiết về thuật toán và mã.
Thực hiện tham chiếu một phần trong J
Tôi quyết định mô tả từng mảnh theo định dạng "vectơ" và tôi chỉ cần các khối n-2 để mô tả một mảnh n-polystrip (chỉ có 1 2-polystrip và nó được trả lại rõ ràng). Các khối mô tả hướng tương đối: 0 - không thay đổi; 1 - rẽ trái; 2 - rẽ phải. Không quan trọng người ta sẽ bắt đầu theo hướng nào mà chỉ cho biết vị trí của ô tiếp theo. Có thể có bất kỳ số 0 liên tiếp nào, nhưng 1 và 2 luôn luôn là số đơn. Việc triển khai này là một phần, vì nó không tính đến các lỗ - các giải pháp cho n> 6 cũng tính các phần có lỗ.
101010
trong ký hiệu mẫu của bạn)?