Olympic chuyên KHTN 2024 - Sokoban

Xem dạng PDF

Gửi bài giải

Điểm: 110,00 (OI)
Giới hạn thời gian: 1.5s
Giới hạn bộ nhớ: 1G
Input: stdin
Output: stdout

Dạng bài
Ngôn ngữ cho phép
C, C++, Java, Output Only, Pascal, PyPy, Python, Scratch, TEXT

Trong trường hợp đề bài hiển thị không chính xác, bạn có thể tải đề bài tại đây: Đề bài

Bài toán này lấy ý tưởng từ một trò chơi nổi tiếng có tên là "Sokoban".

Bob là người đã phá đảo màn chơi khó nhất của trò chơi Sokoban. Tuy nhiên, anh ấy đã tốn quá nhiều thời gian vào trò chơi này vì nó đòi hỏi tư duy sáng tạo và cả tính kiên nhẫn của người chơi nữa. Do đó, anh ta quyết định phát triển một mô hình có thể tự động giải một map Sokoban theo yêu cầu của người dùng. Vì đây là một bài toán cực khó, nên Bob muốn bắt đầu từ một mô hình cơ bản trước: giải trò chơi "One-box Sokoban". Luật chơi của trò chơi này như sau:

Cho một lưới ô vuông có kích thước ~n \times m~ gồm ~n~ hàng, ~m~ cột. Các hàng được đánh số từ ~1~ đến ~n~ từ trên xuống dưới, các cột được đánh số từ ~1~ đến ~m~ từ trái sang phải, ô nằm giao giữa hàng ~i~ và cột ~j~ được gọi là ô ~(i, j)~. Một số ô trong lưới là ô bị chặn, không thể di chuyển vào được.

Có một con Sokoban đứng ở ô ~(x_S, y_S)~ và một cái thùng nằm ở ô ~(x_B, y_B)~. Nhiệm vụ của bạn là điều khiển con Sokoban sao cho nó đưa được thùng đến ô ~(x_G, y_G)~ ~(1 \le x_S, x_B, x_G \le n, 1 \le y_S, y_B, y_G \le m)~. Đảm bảo ~3~ ô ~(x_S, y_S)~, ~(x_B, y_B)~ và ~(x_G, y_G)~ đều không bị chặn và đôi một phân biệt. Ở mỗi bước, bạn có thể cho Sokoban di chuyển lên trên, xuống dưới, sang trái hoặc sang phải một ô, miễn sao Sokoban luôn nằm ở trong bảng và không đi vào ô bị chặn. Trên đường đi, nếu gặp thùng, Sokoban sẽ "đẩy" thùng dịch chuyển theo hướng đi của mình nếu thùng không đi ra khỏi bảng cũng như không đi vào ô bị chặn. Để hiểu rõ hơn, hãy xem xét ví dụ dưới đây:

Với ~n = 4, m = 5~, các ô ở biên của bảng bị chặn, các ô còn lại thì không, Sokoban đứng ở ô ~(3, 2)~, thùng nằm ở ô ~(3, 3)~, ta có trạng thái giống như ở hình dưới đây:

Ở trạng thái trên, ta có thể điều khiển Sokoban "đẩy" thùng sang bên phải. Khi đó, Sokoban sẽ đứng ở ô ~(3, 3)~, thùng nằm ở ô ~(3, 4)~:

Ở trạng thái này, Sokoban không thể đẩy thùng sang phải tiếp được nữa vì ô ~(3, 5)~ là ô bị chặn.

Vì Bob muốn kiểm thử mô hình của mình, nên anh ấy đã nhờ bạn giúp.

Yêu cầu: cho một map One-box Sokoban, hãy xác định liệu bạn có thể hoàn thành nhiệm vụ (đưa được thùng đến ô ~(x_G, y_G)~) hay không.

Lưu ý: trò chơi "One-box Sokoban" chỉ có một cái thùng duy nhất, khác với trò Sokoban thông thường.

Input

Mỗi test gồm có nhiều testcase. Dòng đầu tiên là số nguyên dương ~T~ — số lượng testcase ~(1 \le T \le 10)~.

~T~ nhóm dòng tiếp theo, mỗi nhóm dòng biểu diễn một testcase và có dạng như sau:

  • Dòng đầu tiên gồm hai số nguyên dương ~n, m~ — kích thước của lưới ô vuông ~(2 \le n, m \le 10^5, n \times m \le 10^5)~.

  • ~n~ dòng tiếp theo, mỗi dòng gồm ~m~ kí tự. Kí tự thứ ~j~ ở dòng thứ ~i~ là ~a_{i,j}~ biểu diễn trạng thái bắt đầu của ô ~(i, j)~. ~a_{i,j}~ chỉ có thể là một trong ~5~ kí tự '.', '#', 'S', 'B', 'G'. Trong đó:

    • Nếu ~a_{i,j}~ là '#' thì ô ~(i, j)~ là ô bị chặn.

    • Nếu ~a_{i,j}~ là 'S' thì ô ~(i, j)~ là ô bắt đầu của Sokoban, hay ~(i, j) = (x_S, y_S)~.

    • Nếu ~a_{i,j}~ là 'B' thì ô ~(i, j)~ là ô bắt đầu của thùng, hay ~(i, j) = (x_B, y_B)~.

    • Nếu ~a_{i,j}~ là 'G' thì ô ~(i, j)~ là ô mà bạn cần điều khiển Sokoban đẩy thùng đến, hay ~(i, j) = (x_G, y_G)~.

    • Nếu ~a_{i,j}~ là '.' thì ô ~(i, j)~ không có gì cả.

Dữ liệu đảm bảo có đúng ~1~ kí tự 'S', ~1~ kí tự 'B' và ~1~ kí tự 'G' trong ~n \times m~ kí tự này.

Output

Gồm ~T~ dòng, dòng thứ ~i~ là câu trả lời của testcase thứ ~i~: in ra "YES" nếu bạn có thể hoàn thành nhiệm vụ, ngược lại in ra "NO" (không có dấu ngoặc kép, không phân biệt chữ thường, chữ hoa).

Scoring

Subtask Điểm Ràng buộc
1 ~40\%~ ~n \times m \le 1000~.
2 ~60\%~ Không có giới hạn gì thêm.

Sample Input 1

2
9 7
....##S
.##G...
....###
##..#..
##.##..
##B##..
#..##..
#..####
#..#...
9 7
....##S
###G...
....###
##..#..
##.##..
##B##..
#..##..
#..####
#..#...

Sample Output 1

YES
NO

Notes

Giải thích test ví dụ:

  • Ở testcase thứ nhất, một cách để điều khiển Sokoban hoàn thành nhiệm vụ được biểu diễn trên hệ thống thi.

  • Ở testcase thứ hai, mọi thứ đều giống testcase thứ nhất, ngoại trừ việc ô ~(2, 1)~ bị chặn. Điều này khiến cho Sokoban không thể hoàn thành nhiệm vụ được.


Bình luận

Hãy đọc nội quy trước khi bình luận.


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