Khi hàng 0 nằm dưới cùng
Nếu chỉ số hàng tăng từ dưới lên, hàng trên cùng phải được in trước với chỉ số n−1, tiếp theo n−2,…,0. Trong showQueen, dùng from_bottom=True để vòng ngoài đi theo range(n−1,−1,−1).
Không cần sửa check hoặc trynext: phản chiếu theo chiều dọc vẫn giữ quan hệ cùng hàng và độ chênh hàng tuyệt đối. A=[1,3,0,2] vẫn ghi hàng của quân theo cột, nhưng khi hàng 0 nằm dưới thì dòng đầu in 0 1 0 0, thay vì 0 0 1 0.
```text
python3 g11-cs-xep-hau.py 4 --hang-tu-duoi
```
Hai lần chạy vẫn có Q(4)=2. Cần so ma trận của từng phương án theo thứ tự dòng đảo ngược, không chỉ nhìn tổng số.
Chỉ đếm để tránh in quá nhiều bàn cờ
Đặt show_results=False vẫn tăng ncount tại mỗi lá, chỉ bỏ phần in bàn cờ. Trong tệp đầy đủ dùng:
```text
python3 g11-cs-xep-hau.py 8 --chi-dem
python3 g11-cs-xep-hau.py 13 --chi-dem
```
| n | Q(n) |
|---|---|
| 1 | 1 |
| 2 | 0 |
| 3 | 0 |
| 4 | 2 |
| 5 | 10 |
| 6 | 4 |
| 7 | 40 |
| 8 | 92 |
| 9 | 352 |
| 10 | 724 |
| 11 | 2680 |
| 12 | 14200 |
| 13 | 73712 |
Các phương án được phân biệt theo dãy vị trí; không tự gộp các bàn cờ quay hoặc phản chiếu thành một. Q(n) không nhất thiết tăng ở mọi bước, chẳng hạn Q(5)>Q(6).
Thời gian chạy tăng nhanh; chỉ đếm giúp giảm đầu ra nhưng không bỏ các nhánh tìm kiếm. Bản thực hành nhận n từ 1 đến 13, chỉ in bàn cờ khi n<=8; với n>8 phải dùng --chi-dem. Đây là giới hạn thực hành của tệp, không phải giới hạn bài toán.
Bài luyện
Muốn hàng 0 nằm dưới cùng khi in, cần đổi phần nào?
Hàng n−1 được in trước, hàng 0 in cuối.
Điều kiện đường chéo vẫn giữ nguyên.
Như vậy sẽ phá vị trí đã tìm.
Vẫn phải kiểm mọi quân đã đặt.
Lời giải
Chiều đánh số hàng chỉ làm đổi cách trình bày ma trận. Duyệt hàng từ n−1 xuống 0 đặt hàng 0 dưới cùng; quan hệ cùng hàng và độ chênh tuyệt đối không đổi nên thuật toán tìm kiếm vẫn đúng.
Bài luyện
Chạy n=8 với --chi-dem cần nhận kết quả nào?
Các điều kiện hợp lệ vẫn được giữ.
Tắt in không tắt phép đếm tại lá.
Hai hoạt động được điều khiển riêng.
Thuật toán vẫn duyệt mọi nhánh hợp lệ.
Lời giải
Tại mỗi nghiệm, chương trình vẫn tăng ncount. show_results=False chỉ bỏ print và showQueen, nên tổng vẫn bằng 92 và đầu ra chỉ có dòng tổng.
Bài luyện
Từ bảng Q(5)=10, Q(6)=4, kết luận nào đúng?
Q(6)=4 nên có nghiệm.
Mỗi kích thước phải được xét theo điều kiện riêng.
Hai giá trị này cho một trường hợp giảm.
Không có quy tắc tăng như vậy trong bài.
Lời giải
Q(n) đếm các phương án trên bàn cờ đúng kích thước n. Kết quả 10 rồi 4 chứng tỏ không thể suy rằng mỗi lần tăng n thì tổng nghiệm luôn tăng; cần chạy và kiểm từng kích thước.
Đang học