trang chủ / bài tập / pushabox / lời giải

Đẩy Hộp

Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Tác giả: huunguyenhuunguyen

Lời giải: Push a Box

Nhận xét quan trọng

Nếu theo dõi cả vị trí của Bessie lẫn vị trí của hộp, không gian trạng thái sẽ là O(N2M2) — quá lớn với N,M1500.

Nhận thấy rằng vị trí chính xác của Bessie không quan trọng, chỉ cần biết Bessie đang ở phía nào của hộp (trên, dưới, trái, phải). Do đó, trạng thái được rút gọn thành: (vị trí hộp, hướng Bessie tiếp cận hộp) — chỉ O(NM) trạng thái.

Thuật toán

Bước 1: Xây dựng đồ thị thành phần liên thông song (Biconnected Components)

Trước khi thực hiện BFS trên trạng thái (hộp, hướng), cần trả lời các câu hỏi:

Nếu hộp đang ở ô B, Bessie có thể đi từ phía d1 sang phía d2 của hộp mà không di chuyển hộp không?

Đây tương đương với: có đường đi trong lưới (bỏ ô B) từ ô kề B theo hướng d1 đến ô kề B theo hướng d2 không?

Sử dụng biconnected components (thành phần liên thông song): nếu hai đỉnh thuộc cùng một biconnected component, thì có đường đi giữa chúng không đi qua bất kỳ đỉnh khớp nào — nghĩa là có thể đi vòng quanh mà không cần đi qua đỉnh bị chặn.

Cụ thể: với mỗi ô B trong lưới, xây dựng BCC của đồ thị các ô trống (không kể ô B). Hai phía của hộp có thể chuyển đổi khi Bessie đi vòng nếu hai ô kề đó thuộc cùng một BCC — điều này trả lời được trong O(1) sau tiền xử lý O(NM).

Bước 2: BFS trên không gian trạng thái

Trạng thái: (rB,cB,d) — hộp ở (rB,cB), Bessie tiếp cận từ hướng d{0,1,2,3} (Bắc, Nam, Tây, Đông).

Từ trạng thái (rB,cB,d):

  • Đẩy hộp: Bessie đẩy hộp theo hướng đối diện với d. Hộp dịch sang ô mới (rB,cB); Bessie tiếp cận hộp từ hướng d (giờ cô ở vị trí cũ của hộp). Chuyển trạng thái: (rB,cB,d).
  • Đi vòng quanh hộp: Không đẩy hộp, Bessie chuyển sang phía d của hộp. Được phép khi hai ô kề tương ứng thuộc cùng BCC (sau khi bỏ ô B). Chuyển trạng thái: (rB,cB,d).

Thực hiện BFS từ trạng thái ban đầu: hộp ở vị trí B, hướng Bessie tiếp cận tương ứng với vị trí A.

Bước 3: Trả lời truy vấn

Sau BFS, ô (r,c) có thể đạt được nếu tồn tại ít nhất một hướng d sao cho trạng thái (r,c,d) đã được thăm.

Độ phức tạp

  • Tiền xử lý BCC: O(NM)
  • BFS: O(NM) trạng thái, mỗi trạng thái xử lý O(1)
  • Trả lời truy vấn: O(1) mỗi truy vấn
  • Tổng: O(NM+Q)

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.46 awk 1.3.4 gcc 16.1.0 csc 6.12.0.200 g++ 16.1.0 g++-themis 16.1.0 g++17 16.1.0 g++20 16.1.0 g++23 16.1.0 clang++ 22.1.6 dmd 2.112.0 dart 3.12.1 gforth 0.7.3 gfortran 12.2.0 go 1.26.3 groovyc 5.0.6 javac 25.0.3 node 26.2.0 kotlinc 2.3.21 sbcl 2.2.9 lua 5.4.8 nim 2.2.10 fpc 3.2.2 fpc-themis 3.2.2 perl 5.36.0 php 8.5.6 pike 8.0 pypy3 7.3.23 python3 3.14.5 racket 8.7 ruby 4.0.5 rustc 1.96.0 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 tclsh 8.6 bun 1.3.14 deno 2.8.1 v 0.5.1 zig 0.16.0