Giấc mơ của Bessie

Đề bài

Mô tả

Cho mê cung N×M ô, mỗi ô có một màu:

  • Đỏ (0): Không thể đi vào.
  • Hồng (1): Đi vào bình thường.
  • Cam (2): Đi vào bình thường; khi đi vào ô cam thì có "mùi cam" và giữ mùi này cho đến khi bị trượt trên ô tím.
  • Xanh (3): Chỉ đi vào được nếu đang có mùi cam. Đi vào ô xanh không làm mất mùi cam.
  • Tím (4): Khi đi vào ô tím thì bị trượt theo đúng hướng vừa đi.

Bắt đầu ở ô (1,1) (góc trên trái), cần đến ô (N,M) (góc dưới phải). Mỗi lần di chuyển sang một ô kề cạnh (trên, dưới, trái, phải) tính là 1 bước.

Quy tắc trượt trên ô tím:

  • Ngay khi đi vào một ô tím thì mất mùi cam (nếu đang có), và không thể dừng lại: phải đi tiếp sang ô kế tiếp theo đúng hướng đang đi. Mỗi ô trượt qua cũng tính là 1 bước.
  • Cú trượt kết thúc khi ô kế tiếp theo hướng đó không phải ô tím. Nếu ô đó đi vào được thì bước vào ô đó rồi dừng; nếu ô đó không đi vào được (ra ngoài mê cung, ô đỏ, hoặc ô xanh trong khi không có mùi cam) thì dừng ngay trên ô tím cuối cùng.
  • Sau khi dừng thì lại được chọn hướng đi tùy ý như bình thường.

Hãy tìm số bước ít nhất để đến ô (N,M). Nếu không thể đến được, in 1.

Dữ liệu vào

  • Dòng đầu: hai số nguyên NM.
  • N dòng tiếp theo: mỗi dòng M số nguyên từ 0 đến 4 mô tả màu các ô.

Dữ liệu ra

Một số nguyên duy nhất: số bước ít nhất, hoặc 1 nếu không đến được.

Ràng buộc

  • 1N,M1000
  • Ô (1,1) và ô (N,M) luôn là hồng (1).

Ví dụ

Input Output Giải thích
4 4
1 0 2 1
1 1 4 1
1 0 4 0
1 3 1 1
10 Đi xuống cột 1 tới (4,1) mất 3 bước nhưng ô (4,2) là xanh nên chưa qua được. Phải đi lấy mùi cam ở ô (1,3) rồi vòng xuống, tổng cộng 10 bước.
2 7
1 4 4 1 1 4 0
2 0 2 1 3 4 1
7 Sang phải vào ô tím (1,2), trượt qua (1,3) rồi dừng ở (1,4): 3 bước. Đi tiếp tới (1,5): 4 bước. Vào ô tím (1,6), ô kế tiếp (1,7) là đỏ nên dừng ngay trên (1,6): 5 bước. Đi xuống ô tím (2,6), trượt tiếp thì ra ngoài mê cung nên dừng tại đó: 6 bước. Cuối cùng sang (2,7): 7 bước.

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.47 awk 1.3.4 gcc 16.2.0 dotnet 10.0.400 g++ 16.2.0 g++-themis 16.2.0 g++17 16.2.0 g++20 16.2.0 g++23 16.2.0 clang++ 22.1.8 dmd 2.113.0 dart 3.13.2 gforth 0.7.3 gfortran 12.2.0 go 1.27.0 groovyc 5.1.1 javac 25.0.4 node 26.8.1 julia 1.12.7 kotlinc 2.4.10 lean 4.33.1 sbcl 2.2.9 lua 5.4.9 nim 2.2.10 fpc 3.2.2 fpc-themis 3.2.2 perl 5.36.0 php 8.5.10 pike 8.0 swipl 9.0.4 pypy3 7.3.23 python3 3.14.7 racket 8.7 ruby 4.0.6 rustc 1.98.0 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 swiftc 6.3.3 tclsh 8.6 bun 1.4.0 deno 2.9.6 v 0.5.2 zig 0.16.0