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

Tìm tất cả đường đi đơn trong mê cung

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

In ma trận khi gặp nghiệm

```python def printmaze(outmaze): for row in outmaze: print(*row) ``` Đường đi đơn không đi qua một ô hai lần. Bài này liệt kê mọi đường đi đơn từ điểm xuất phát đến đích, không yêu cầu các đường có cùng độ dài. Nếu tới đích thì ghi nhận đường và không đi tiếp ra khỏi đích trong nhánh ấy.

Quay lui sau cả nhánh thành công

```python def allMaze(maze, m, n, x, y, sol, path, goals=None, mark_walls=False): global npaths if not (0 <= x < n and 0 <= y < m): return if maze[y][x] != 0 or sol[y][x] == 1: return if goals is None: goals = {(n - 1, m - 1)} sol[y][x] = 1 path.append((x, y)) if (x, y) in goals: npaths += 1 print(f'Đường {npaths}: {path}') printmaze(wall_view(maze, sol, mark_walls)) else: for dx, dy in [(1, 0), (0, 1), (-1, 0), (0, -1)]: allMaze(maze, m, n, x + dx, y + dy, sol, path, goals, mark_walls) path.pop() sol[y][x] = 0 ``` Đặt npaths=0, tạo sol toàn 0 và path=[] trước lời gọi gốc. Hàm wall_view của bài trước chỉ tạo bản trình bày. Mỗi bước thêm tọa độ vào path để ghi cả thứ tự đi; ma trận vết chỉ cho tập ô đã đi, chưa biểu diễn đầy đủ thứ tự các bước. Khác solveMaze, hàm không truyền True để dừng cả cây ở nghiệm đầu. Sau mỗi nhánh, kể cả nhánh tới đích, đều pop tọa độ và đặt dấu ô về 0. Nhờ vậy mức trước thử được đường khác; dấu chỉ cấm lặp ô trong đường hiện tại, không cấm mọi đường về sau.

Hai đường trên lưới 2×2

Mẫu nhỏ gồm bốn ô mở. Chạy: ```text python3 g11-cs-me-cung.py g11-cs-me-cung-nho.inp --tat-ca ``` Cần nhận hai đường theo thứ tự thử: | Đường | Các tọa độ theo thứ tự | |---|---| | 1 | (0,0)→(1,0)→(1,1) | | 2 | (0,0)→(0,1)→(1,1) | Mỗi đường có một ma trận vết kèm theo; cuối cùng tổng bằng 2. Kiểm từng đường không lặp tọa độ, các bước kề cạnh và chỉ đi qua maze bằng 0. Sau khi liệt kê xong, sol trở lại toàn 0 và path rỗng, gồm cả dấu ở đích. Tệp thực hành in trực tiếp các đường, không nhận --output trong chế độ này. Chỉ nhận tối đa 16 ô vì số đường tăng rất nhanh, kể cả khi lưới nhỏ. Không thay tất cả đường bằng chỉ các đường ngắn nhất.

Bài luyện

Vì sao không trả True để kết thúc toàn bộ sau đường đầu tiên?
Chọn một đáp án

Bài luyện

Sau khi allMaze liệt kê xong lưới 2×2, trạng thái nào đúng?
Chọn một đáp án

Bài luyện

Đường đi đơn có điều kiện nào?
Chọn một đáp án

Bài luyện

Vì sao tệp thực hành in thêm dãy tọa độ có thứ tự?
Chọn một đáp án

Đang học