#768. Giải cứu trên đảo hoang (RESCUE)

Bộ nhớ: 512 MiB Thời gian: 1000 ms Nhập/xuất từ luồng chuẩn
Kiểu bài: Thông thường Kiểu chấm: So sánh văn bản
Đưa lên bởi: Trùm CUỐI

Đề bài

Năm 1944, đặc nhiệm Mike nhận được lệnh từ Bộ Quốc phòng, yêu cầu lập tức đến một hòn đảo hoang trên Thái Bình Dương để giải cứu binh nhì Ryan đang bị quân địch bắt giữ. Ryan bị giam trong một mê cung có địa hình phức tạp, nhưng may mắn là Mike đã có bản đồ địa hình của mê cung. Mê cung có dạng hình chữ nhật, hướng Nam-Bắc được chia thành n hàng, hướng Đông-Tây được chia thành m cột, do đó toàn bộ mê cung được chia thành n \times m ô đơn vị. Vị trí của mỗi ô có thể được biểu diễn bằng một cặp số có thứ tự (số dòng, số cột). Giữa 2 ô liền kề theo hướng Nam-Bắc hoặc Đông-Tây có thể thông nhau, hoặc có một cánh cửa bị khóa, hoặc là một bức tường không thể vượt qua. Trong mê cung có một số ô chứa chìa khóa, và tất cả các cửa được chia thành p loại. Chìa khóa cùng loại sẽ mở được các cửa cùng loại, chìa khóa khác loại sẽ không mở được.

Binh nhì Ryan bị giam ở góc Đông Nam của mê cung, tức là ô (n, m) , và đang trong tình trạng hôn mê. Mê cung chỉ có một lối vào ở góc Tây Bắc. Tức là, Mike có thể trực tiếp đi vào ô (1, 1) . Ngoài ra, thời gian để Mike di chuyển từ một ô sang ô liền kề là 1 , thời gian nhặt chìa khóa tại ô đang đứng cũng như thời gian dùng chìa khóa mở cửa có thể bỏ qua.

Hãy thiết kế một thuật toán giúp Mike đến được ô của Ryan nhanh nhất để giải cứu anh ta.

Dữ liệu:

  • Dòng đầu tiên chứa ba số nguyên, lần lượt biểu thị giá trị của n, m, p .
  • Dòng thứ hai là một số nguyên k , biểu thị tổng số cửa và tường trong mê cung.
  • Dòng thứ i+2 (1 \leq i \leq k ) , chứa 5 số nguyên, lần lượt là x_{i1}, y_{i1}, x_{i2}, y_{i2}, g_i :
    • Khi g_i \geq 1 , nghĩa là giữa ô (x_{i1}, y_{i1}) và ô (x_{i2}, y_{i2}) có một cánh cửa loại g_i .
    • Khi g_i = 0 , nghĩa là giữa ô (x_{i1}, y_{i1}) và ô (x_{i2}, y_{i2}) có một bức tường không thể vượt qua.
  • Dòng thứ k+3 là một số nguyên s , biểu thị tổng số chìa khóa trong mê cung.
  • Dòng thứ k+3+j (1 \leq j \leq s) , chứa 3 số nguyên, lần lượt là x_{i1}, y_{i1}, q_i , biểu thị chìa khóa thứ j nằm ở ô (x_{i1}, y_{i1}) và chìa khóa thứ j dùng để mở cửa loại q_i .
  • Các số nguyên liền kề trên cùng một dòng được phân tách bằng một dấu cách.

Kết quả:

  • Xuất ra thời gian ngắn nhất để Mike giải cứu được binh nhì Ryan. Nếu bài toán vô nghiệm, xuất ra -1 .

Ví dụ:

Dữ liệu:

4 4 9
9
1 2 1 3 2
1 2 2 2 0
2 1 2 2 0
2 1 3 1 0
2 3 3 3 0
2 4 3 4 1
3 2 3 3 0
3 3 4 3 0
4 3 4 4 0
2
2 1 2
4 2 1

Kết quả:

14

Giới hạn:

  • |x_{i1}-x_{i2}|+|y_{i1}-y_{i2}|=1, 0 \leq g_i \leq p
  • 1\leq q_i \leq p
  • n, m, p \leq 10,\ k < 150