Tôi thích Tetris rất nhiều, nhưng tôi không giỏi lắm. Chỉ một lần tôi muốn thấy con tàu vũ trụ cất cánh trước mắt tôi! Và vì máy tính rất tuyệt vời trong mọi thứ, giải pháp khả thi duy nhất là tạo một chương trình để chơi nó cho tôi ... ngoại trừ bạn sẽ làm điều đó cho tôi!
Cho một tetromino (hình dạng được tạo bởi bốn hình vuông) và bản đồ của sân chơi, bạn phải đặt tetromino sao cho nó có số dòng lớn nhất (tạo ra số lượng lớn nhất các hàng đầy đủ các khối) và tạo ra số lượng ít nhất các lỗ mới (một khoảng trống không thể "nhìn thấy" đỉnh của sân chơi 1 ).
Đầu vào
Đầu vào sẽ chứa một ký tự trên một dòng đại diện cho tetromino đang rơi, theo sau là 10 * 18 lưới 2 khoảng trắng ( ) và dấu cộng (
+
).
Nhân vật đại diện cho bất kỳ trong số bảy tetrominoes cơ bản được tìm thấy trong Tetris. Tất cả các mảnh có thể được xoay 90 độ, nhưng không được lật. Tất cả các tetrominoes và phép quay của chúng như sau:
#
S = ## ##
## #
#
Z = ## ##
## #
# ### ##
L = # # # #
## # ###
# ### ##
J = # # # #
## # ###
# # #
T = ### ## ### ##
# # #
O = ##
##
#
I = # ####
#
#
Lưới đại diện cho sân chơi của Tetris, với +
các khối được đặt trước đó. Vì vậy, một ví dụ đầu vào có thể là như sau:
I
+ ++
+ +++++
++ +++++++
++ +++++++
++ +++++++
++ +++++++
++++++ +++
Đầu ra
Đầu ra của bạn sẽ giống hệt với đầu vào, nhưng với tetromino ở vị trí lý tưởng. Tetromino nên được đại diện #
để phân biệt chúng với các khối được đặt trước. Ngoài ra, bạn cũng phải xuất ra bao nhiêu dòng / lỗ mà vị trí của bạn tạo trong biểu mẫu xL yH
trên một dòng mới.
Đầu ra cho ví dụ nêu trên sẽ là 3 :
I
+ ++
+ +++++
++#+++++++
++#+++++++
++#+++++++
++#+++++++
++++++ +++
4L 0H
Bạn chỉ xuất kết quả tốt nhất (s); trong trường hợp có hai hoặc nhiều trường hợp cho cùng một số điểm, bạn phải xuất tất cả chúng (cách nhau bằng một dòng trống). Các kết quả tốt nhất được xác định bằng cách sắp xếp theo số lượng dòng được ghi (giảm dần) trước, sau đó số lượng lỗ mới được tạo (tăng dần). Vì vậy, 1L 1H
là một điểm tốt hơn 0L 0H
.
Tôi sẽ làm việc để tạo một danh sách các đầu vào khác nhau và (các) đầu ra dự kiến mà bạn có thể kiểm tra chương trình của mình. Xem không gian này.
Quy tắc và định hướng
- Đây là môn đánh gôn , do đó, việc thực hiện đúng ngắn nhất sẽ thắng.
- Đầu vào / đầu ra có thể ở bất kỳ phương tiện nào phù hợp với ngôn ngữ đích của bạn (ví dụ: tệp, stdin / stdout, vùng văn bản).
- Nếu ngôn ngữ đích của bạn không hỗ trợ đầu vào nhiều dòng (hoặc bất tiện khi làm như vậy), thay vào đó, bạn có thể phân định từng dòng của đầu vào bằng dấu phẩy (
,
). - Bạn có thể bỏ qua đầu ra của bất kỳ dòng trống nào trong lưới.
- Hãy nhớ rằng tetromino rơi từ trên cao xuống - bạn có thể không đặt mảnh "dưới lòng đất". Do đó, bạn có thể giả định rằng tất cả các vị trí có thể có của mảnh sẽ ở "cấp độ bề mặt" (nghĩa là không có khối nào giữa mảnh và mặt trên của bảng).
- Giả sử rằng sẽ không bao giờ có tình huống bạn bị buộc phải tham gia trò chơi (tetromino được đặt chạm vào trung tâm trên cùng của trường).
- Các giải pháp giống hệt nhau ở đầu ra phải được bỏ qua (ví dụ: có 3 giải pháp đầu ra nếu bạn xoay một cách ngây thơ
O
).
1 Tôi biết rằng điều này sẽ tạo ra một số tích cực sai, nhưng đó là một sự đơn giản hóa.
2 Đây là kích thước lưới được sử dụng trong phiên bản Game Boy.
3 Vâng, 0H
đúng. Kiểm tra lại, tôi nói lỗ mới ; ^)