canuc80k3406·7/50

Mê Cung Hai Kiểu Di Chuyển

Nộp bài trên LQDOJ

Bài 34 · Shortest Paths

Một mê cung có hàng và cột. Ô là ô trống nếu ký tự tương ứng là ., và là tường nếu ký tự đó là #.

Bạn bắt đầu ở một ô trống và cần tới ô trống . Có hai kiểu di chuyển:

  • Đi bộ: sang một ô trống chung cạnh với ô hiện tại. Thao tác này không dùng phép thuật.
  • Dịch chuyển: tới một ô trống thỏa và . Thao tác này dùng đúng một lần phép thuật.

Khi dịch chuyển, các ô nằm giữa điểm đầu và điểm cuối không ảnh hưởng; chỉ ô đích cần là ô trống. Không thao tác nào được đưa bạn ra ngoài mê cung.

Hãy tìm số lần dùng phép thuật ít nhất để tới đích. Nếu không thể tới, in .

Input

  • Dòng đầu chứa hai số nguyên và .
  • Dòng thứ hai chứa - tọa độ xuất phát.
  • Dòng thứ ba chứa - tọa độ đích.
  • Mỗi trong dòng tiếp theo chứa một xâu độ dài mô tả một hàng của mê cung.

Output

  • In số lần dịch chuyển ít nhất, hoặc nếu không tồn tại hành trình.

Constraints

  • .
  • .
  • .
  • Mỗi ô là . hoặc #.
  • Ô xuất phát và ô đích đều là ô trống và khác nhau.

Scoring

  • Subtask ( số điểm): .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

5 5
1 1
5 5
..#..
..#..
#####
..#..
..#..

Output

1

Giải thích: Có thể đi bộ tới , rồi dịch chuyển thẳng tới vì hai tọa độ chỉ lệch . Sau đó đi bộ tới đích, nên chỉ cần một lần phép thuật.

Test 2

Input

4 6
1 2
4 5
......
.####.
......
......

Output

0

Giải thích: Đi dọc hàng đầu tới cột , xuống qua ô trống ở cột này rồi đi tới đích hoàn toàn bằng các bước chung cạnh, nên không cần dùng phép thuật.

Lời giải tóm tắt
  • Mô hình đồ thị: Mỗi ô trống là một đỉnh. Bước đi bộ tạo cạnh trọng số 0; một lần dịch chuyển tạo cạnh trọng số 1. Bài toán trở thành tìm đường đi ngắn nhất trên đồ thị chỉ có trọng số 0 và 1.
  • Thuật toán 0-1 BFS: Lưu khoảng cách trong dist và dùng một deque:
  • Thuật toán 0-1 BFS: nếu nới lỏng bằng bước đi bộ, đưa ô mới vào đầu deque;
  • Thuật toán 0-1 BFS: nếu nới lỏng bằng dịch chuyển, đưa ô mới vào cuối deque.
  • Thuật toán 0-1 BFS: Từ mỗi ô chỉ xét bốn hàng xóm chung cạnh và tối đa 25 ô trong cửa sổ 5 × 5.
  • Chứng minh tính đúng đắn: 0-1 BFS là Dijkstra chuyên biệt cho trọng số 0/1. Một cạnh trọng số 0 giữ nguyên nhãn nên đỉnh mới phải được ưu tiên ngay; cạnh trọng số 1 chỉ có thể tạo nhãn lớn hơn một đơn vị nên được đặt phía sau. Vì vậy các nhãn hữu ích được xử lý theo thứ tự không giảm.
  • Chứng minh tính đúng đắn: Mọi thao tác hợp lệ trong đề tương ứng đúng một cạnh đã xét và ngược lại. Do đó khoảng cách từ ô xuất phát tới mỗi ô bằng số phép thuật ít nhất; kết quả tại ô đích là đáp án cần tìm.
  • Độ phức tạp: Mỗi ô xét một số hằng thao tác, nên thời gian O(h × w) và bộ nhớ O(h × w).