VM 14 Bài 20 - Crossword

Xem dạng PDF

Gửi bài giải

Điểm: 2,00 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 512M
Input: stdin
Output: stdout

Dạng bài
Ngôn ngữ cho phép
C, C++, Go, Java, Kotlin, Pascal, PyPy, Python, Rust, Scratch

Trò chơi ô chữ là một trong những trò chơi lâu đời nhất được con người phát minh ra. Ở trò chơi này, bạn được cho một bảng chữ nhật kích thước ~N \times M~ ~(N~ hàng ~M~ cột), được chia thành cách hình vuông nhỏ kích thước ~1 \times 1~. Ô ở hàng ~u~, cột ~v~ được ký hiệu là ô ~(u~, ~v)~. Có một số ô trống tạo thành các từ hàng ngang và hàng dọc. Bạn được cho một số gợi ý, và cần phải điền các chữ cái vào bảng dựa theo những gợi ý được cho.

image

Ở trong hình minh họa, bạn có một bảng kích thước ~15 \times 15~ ~(M = N = 15)~. Bạn cần điền những chữ cái vào các ô màu trắng. Chú ý rằng mỗi ô trắng thuộc ít nhất một từ hàng ngang hoặc một từ hàng dọc. Mỗi gợi ý có dạng:

  • Từ hàng ngang bắt đầu từ ô đánh số ~1~ là tên ~1~ quốc gia
  • Từ hàng dọc bắt đầu từ ô đánh số ~2~ là tên một thành phố
  • ...

Một vài chú ý:

  • Ô ~23~ là điểm bắt đầu của ~2~ từ: một từ nằm dọc, ~1~ từ nằm ngang. Trong bài này, một ô có thể là điểm bắt đầu của ~2~ từ ~(2~ từ đó phải có hướng khác nhau).
  • Từ ngắn nhất bắt đầu từ ô ~1~, và có độ dài ~4~. Trong bài này, từ ngắn nhất hợp lệ có thể xuất hiện trên bảng cũng có độ dài là ~4~.

Trong bài toán này, nhiệm vụ của bạn là tạo ra một bảng ô chữ. Bạn được cho một bảng trống kích thước ~N \times M~ và một danh sách gồm ~K~ từ (các từ đôi một khác nhau). Nhiệm vụ của bạn là điền các từ này lên bảng sao cho:

  • Mỗi từ được điền vào một dãy các ô liên tiếp theo chiều ngang từ trái sang phải hoặc chiều dọc từ trên xuống dưới.
  • Các từ có cùng hướng với nhau và nằm trên cùng một hàng (hoặc cùng một cột) không được có ô chung hay chạm nhau ~(2~ ô được gọi là chạm nhau khi có chung một cạnh).
  • Nếu một từ hàng ngang và một từ hàng dọc giao nhau, thì ô giao nhau phải có cùng chữ cái.
  • Mỗi từ trong danh sách chỉ được điền đúng một lần lên bảng.

Input

  • Dòng đầu tiên chứa ~3~ số tự nhiên ~N~, ~M~, ~K~. ~(1 \leq N~, ~M \leq 50~; ~1 \leq K \leq 1000)~
  • ~K~ dòng tiếp theo, mỗi dòng chứa một từ ~(4 \leq~ độ dài từ ~\leq 30)~. Các từ chỉ gồm các chữ cái in thường từ ~a~ tới ~z~.

Output

  • Dòng đầu tiên ghi ra một số tự nhiên ~X~ là số từ điền được vào bảng.
  • ~X~ dòng sau, mỗi dòng ghi ~4~ số tự nhiên: id ~u~ ~v~ ~t~ với ý nghĩa: từ thứ id được điền vào vị trí ~(u~, ~v)~ trên bảng. Nếu ~t = 0~ thì từ được điền từ trái sang phải, nếu ~t = 1~ thì từ được điền từ trên xuống dưới. Chú ý rằng các từ của bạn phải được điền hoàn toàn vào bên trong bảng (không chữ cái nào được điền ra ngoài bảng).

Giới hạn

  • Với mỗi test, nếu output của bạn không hợp lệ, bạn được ~0~ điểm. Nếu output hợp lệ:

    • Gọi ~X~ là số từ nằm ngang mà bạn điền được lên bảng.
    • Gọi ~Y~ là số từ nằm dọc mà bạn điền được lên bảng.
    • Gọi ~Z~ là số ô thuộc ~2~ từ ~(1~ từ nằm ngang và ~1~ từ nằm dọc).
    • Gọi ~T~ là số ô thuộc ít nhất ~1~ từ.
    • Điểm của bạn là: $$\min\left(20, \frac{X \times Y + Z^{1.5} + T}{M \times N} \right)$$.

Sample Input

4 4 4
abcd
xyzt
buyv
dwtz

Sample Output

4
1 1 1 0
2 3 1 0
3 1 2 1
4 1 4 1

Note

Với output này:

  • ~X = 2~
  • ~Y = 2~
  • ~Z = 4~
  • ~T = 12~

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.