trang chủ / bài tập / polysnake

Bắt rắn

Đề bài

Mô tả

Polycarp thích vẽ những con rắn lên một tờ giấy kẻ ô kích thước n×m (n hàng, m cột).

Anh vẽ các con rắn bằng các chữ cái Latin thường: con rắn đầu tiên dùng chữ 'a', con thứ hai dùng chữ 'b', con thứ ba dùng chữ 'c', và cứ thế tiếp tục. Mỗi con rắn có một chữ cái riêng, nên tổng số con rắn không vượt quá 26.

Mỗi con rắn là một đoạn thẳng, nằm ngang hoặc dọc, độ rộng bằng 1. Nghĩa là mỗi con rắn có kích thước 1×l hoặc l×1 với l là độ dài của nó (con rắn không được gấp khúc).

Khi vẽ một con rắn mới, Polycarp có thể vẽ đè lên những ô đã có chữ: giá trị mới sẽ ghi đè giá trị cũ trong ô đó.

Cho một tờ giấy đã vẽ xong (mỗi ô hoặc là một chữ cái thường, hoặc là dấu chấm '.' biểu diễn ô trống). Hãy xác định xem có thể thu được tờ giấy này từ một tờ giấy trống bằng cách vẽ các con rắn theo luật trên hay không. Nếu có, hãy chỉ ra một cách vẽ.

Lưu ý: các con rắn được đánh chữ cái liên tiếp bắt đầu từ 'a'. Nếu có k con rắn thì chúng lần lượt dùng các chữ 'a', 'b', ..., chữ cái thứ k; một con rắn bị vẽ đè hoàn toàn bởi các con rắn sau vẫn được tính vào số thứ tự này (có thể không để lại dấu vết nào trên giấy).

Dữ liệu vào

  • Dòng đầu chứa số nguyên t: số lượng bộ dữ liệu.
  • Với mỗi bộ dữ liệu:
    • Dòng đầu chứa hai số nguyên n,m.
    • n dòng tiếp theo, mỗi dòng gồm m ký tự mô tả nội dung các ô: chữ cái Latin thường hoặc dấu chấm '.'.

Dữ liệu ra

Với mỗi bộ dữ liệu, in ra:

  • Dòng đầu in YES nếu có thể vẽ được, ngược lại in NO.
  • Nếu là YES, dòng tiếp theo in số nguyên k (0k26): số con rắn. Sau đó in k dòng, dòng thứ i gồm bốn số nguyên r1,c1,r2,c2 là toạ độ hai ô đầu mút của con rắn thứ i (1r1,r2n, 1c1,c2m). Các con rắn phải được in theo đúng thứ tự vẽ.

Nếu có nhiều đáp án, in ra đáp án bất kỳ.

Ràng buộc

  • 1t105
  • 1n,m2000
  • Tổng diện tích của tất cả các tờ giấy trong một bộ test không vượt quá 4·106.

Ví dụ

Input Output Giải thích
1
5 6
...a..
..bbb.
...a..
.cccc.
...a..
YES
3
1 4 5 4
2 3 2 5
4 2 4 5
Vẽ con rắn 'a' dọc theo cột 4 (từ hàng 1 đến hàng 5), rồi 'b' ngang trên hàng 2, rồi 'c' ngang trên hàng 4. Chữ 'a' ở hàng 2 và hàng 4 bị 'b', 'c' vẽ đè.
2
3 3
...
.a.
...
2 2
bb
cc
YES
1
2 2 2 2
YES
3
1 1 1 2
1 1 1 2
2 1 2 2
Bộ 1: một con rắn 'a' dài 1 ô. Bộ 2: chữ 'a' không xuất hiện nên đặt con rắn 'a' ở vị trí bất kỳ rồi bị vẽ đè (ở đây trùng chỗ 'b'); sau đó 'b' phủ hàng 1, 'c' phủ hàng 2.
1
3 5
..b..
aaaaa
..b..
NO Chữ 'b' xuất hiện ở hàng 1 và hàng 3, cùng cột 3, nên con rắn 'b' phải là đoạn dọc từ hàng 1 đến hàng 3. Nhưng 'b' được vẽ sau 'a' (b > a), nên nó sẽ phủ luôn ô (hàng 2, cột 3), khiến ô đó phải là 'b' chứ không thể là 'a'. Vì vậy không thể tạo ra tờ giấy này.

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