JOI 2022 - Carpet

Xem PDF



Dạng bài
Ngôn ngữ cho phép
Assembly, Awk, C, C#, C++, Clang, Cobol, D, Groovy, Haskell, JS, Java, Kotlin, Lua, Node JS, OCaml, ObjectiveC, PHP, Pascal, Perl, Prolog, Pypy, Pypy 3, Python, Ruby, Rust, Scala, Scratch, Swift
Điểm: 1000 (p) Thời gian: 2.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

Bitaro thích những đồ vật đẹp và vừa mua một tấm thảm mới. Tấm thảm có hình chữ nhật, được chia thành \(H\) hàng và \(W\) cột ô vuông. Mỗi ô được tô màu trắng hoặc đen. Ô ở hàng thứ \(i\) từ trên xuống và cột thứ \(j\) từ trái sang (\(1 \le i \le H\), \(1 \le j \le W\)) có màu trắng nếu ký tự thứ \(j\) của xâu \(S_i\)., và có màu đen nếu ký tự đó là #.

Bitaro nghĩ ra một trò chơi: đặt một quân cờ ở ô trên cùng bên trái của tấm thảm, rồi thực hiện thao tác sau một số lần để đưa quân cờ đến ô dưới cùng bên phải:

  • Chọn một ô có màu khác với ô quân cờ đang đứng và kề với ô đó theo một trong bốn hướng trên, dưới, trái, phải; sau đó chuyển quân cờ sang ô đã chọn.

Bitaro muốn thực hiện ít thao tác nhất có thể. Tuy nhiên, tùy theo hoa văn của tấm thảm, có thể không đưa được quân cờ đến đích.

Cho hoa văn của tấm thảm, hãy xác định liệu có thể đưa quân cờ từ ô trên cùng bên trái đến ô dưới cùng bên phải bằng cách lặp lại thao tác trên hay không. Nếu có thể, hãy tìm số thao tác ít nhất.

Dữ liệu vào

Dữ liệu vào có dạng:

H W
S_1
S_2
...
S_H

Dữ liệu ra

In ra một dòng chứa số thao tác ít nhất nếu có thể đưa quân cờ từ ô trên cùng bên trái đến ô dưới cùng bên phải. Nếu không thể, in ra \(-1\).

Ràng buộc

  • \(1 \le H \le 500\).
  • \(1 \le W \le 500\).
  • \((H,W) \ne (1,1)\).
  • \(S_i\) là xâu có độ dài \(W\) (\(1 \le i \le H\)).
  • Mỗi ký tự của \(S_i\). hoặc # (\(1 \le i \le H\)).
  • \(H,W\) là các số nguyên.

Phân nhóm

  1. 4 điểm: \(H=1\).
  2. 14 điểm: \(H \le 5\), \(W \le 5\).
  3. 24 điểm: \(H \le 30\), \(W \le 30\).
  4. 58 điểm: Không có ràng buộc bổ sung.

Ví dụ

Ví dụ 1

Input
4 5
...#.
#####
...#.
#.###
Output
9
Note

Chẳng hạn, có thể di chuyển quân cờ theo hai cách trong hình sau:

Cách bên trái đưa quân cờ từ ô trên cùng bên trái đến ô dưới cùng bên phải sau \(9\) thao tác, còn cách bên phải cần \(13\) thao tác. Không thể đến đích với ít hơn \(9\) thao tác, nên in ra \(9\).

Ví dụ này thỏa mãn ràng buộc của các subtasks \(2,3,4\).

Ví dụ 2

Input
3 3
...
...
...
Output
-1
Note

Có trường hợp không thể thực hiện thao tác nào ngay từ đầu. Trong ví dụ này, không thể đưa quân cờ đến ô dưới cùng bên phải, nên in ra \(-1\).

Ví dụ này thỏa mãn ràng buộc của các subtasks \(2,3,4\).

Ví dụ 3

Input
1 5
.#.#.
Output
4
Note

Ví dụ này thỏa mãn ràng buộc của tất cả các subtasks.

Ví dụ 4

Input
5 5
###.#
.#...
.#..#
.####
##..#
Output
12
Note

Ví dụ này thỏa mãn ràng buộc của các subtasks \(2,3,4\).

Ví dụ 5

Input
7 5
.#.##
##...
.#.##
.###.
##.#.
...#.
##.#.
Output
12
Note

Ví dụ này thỏa mãn ràng buộc của các subtasks \(3,4\).

Nguồn

Đề bài Carpet, JOI 2021/2022, vòng loại thứ hai, bài 2 của Ủy ban Olympic Tin học Nhật Bản. Đề gốc và bản dịch tiếng Việt được cung cấp theo giấy phép CC BY-SA 4.0.

Bình luận

Mới nhất
Tải bình luận...

Không có bình luận nào.

Kỳ thi: