btvn.vn
Tìm kiếm Đăng nhập

Kiểm tra vị trí Hậu kế tiếp

Lưu trên thiết bị này
Chuyên đề lựa chọn CS: Kĩ thuật duyệt · Chọn bài khác

Hai điều kiện với mọi cột trước

Đang thử hàng i tại cột j; các cột k<j đã đặt xong. Để không cùng hàng, cần i khác A[k]. Để không cùng đường chéo, cần: $$|A[k]-i|\ne|j-k|.$$ Trên lưới vuông, đi chéo làm hàng và cột thay đổi cùng số ô, nên hai độ chênh tuyệt đối bằng nhau chính là trường hợp bị loại. Phải thỏa với **mọi quân đã đặt**, không chỉ quân ngay bên trái.

Chỉ đọc tiền tố đã đặt

```python def check(A, i, j): for k in range(j): if A[k] == i: return False if abs(A[k] - i) == abs(j - k): return False return True ``` Hàm trả False ngay khi thấy một quân khống chế vị trí đang thử. Chỉ khi hết range(j) mà không xung đột mới trả True. Những phần tử từ A[j] trở đi chưa được dùng làm quân đã đặt, dù dãy tạo sẵn đang chứa 0 hoặc giá trị của nhánh trước.

Xét từng hàng trong một cột

Bàn cờ 5×5 đã có A[0]=1, A[1]=4. Thử đặt tại cột 2: | Hàng thử i | Kết quả | Căn cứ | |---|---|---| | 0 | Được | Không trùng hàng; các độ chênh hàng khác độ chênh cột | | 1 | Loại | Trùng hàng với cột 0 | | 2 | Được | Không trùng hàng hoặc đường chéo | | 3 | Loại | Với cột 1: chênh hàng 1, chênh cột 1 | | 4 | Loại | Trùng hàng với cột 1 | Vậy có thể thử A[2]=0 hoặc 2. Được đặt ở bước này chưa bảo đảm nhánh ấy sẽ xếp đủ cả năm quân; việc tìm tiếp vẫn phải diễn ra.

Bài luyện

Đã đặt quân tại cột 0,hàng 1. Thử cột 2,hàng 3 bị loại vì sao?
Chọn một đáp án

Bài luyện

Với bàn cờ 5×5 và tiền tố [1,4], những hàng nào hợp lệ cho cột 2?
Chọn một đáp án

Bài luyện

Vì sao check chỉ xét range(j)?
Chọn một đáp án

Đang học