Hãy tưởng tượng kịch bản sau đây: bạn đang chơi tàu chiến với một người bạn nhưng quyết định gian lận. Thay vì di chuyển một con tàu sau khi anh ta bắn vào nơi con tàu của bạn từng ở, bạn quyết định không đặt bất kỳ con tàu nào cả. Bạn nói với anh ta tất cả các cú đánh của anh ta là bỏ lỡ, cho đến khi không thể đặt tàu theo cách như vậy.
Bạn phải viết một hàm hoặc một chương trình đầy đủ bằng cách nào đó có 3 đối số: kích thước trường, danh sách số lượng kích cỡ tàu và danh sách ảnh.
Chiến trường
Một trong những tham số đã cho là kích thước bảng. Chiến trường là một ô vuông và tham số đã cho chỉ đơn giản là một mặt của hình vuông.
Ví dụ, dưới đây là một bảng có kích thước 5.
Các tọa độ trên trường được chỉ định dưới dạng chuỗi 2 thành phần: một chữ cái theo sau là một số. Bạn có thể dựa vào các chữ cái trong một số trường hợp cụ thể.
Chữ cái chỉ định cột, số chỉ định hàng của ô (được lập chỉ mục 1). Ví dụ trong hình trên, ô được tô sáng được ký hiệu là "D2"
.
Vì chỉ có 26 chữ cái, trường không thể lớn hơn 26x26.
Tàu thuyền
Các tàu là các đường thẳng từ 1 khối trở lên. Số lượng tàu được chỉ định trong một danh sách, trong đó phần tử đầu tiên là số lượng tàu 1 ô, thứ hai - của tàu 2 ô, v.v.
Ví dụ, danh sách [4,1,2,0,1]
sẽ tạo các tàu sau:
Khi được đặt trên chiến trường, tàu không thể giao nhau, hoặc thậm chí chạm vào nhau. Thậm chí không có góc. Tuy nhiên, họ có thể chạm vào các cạnh của lĩnh vực.
Dưới đây bạn có thể thấy một ví dụ về vị trí tàu hợp lệ:
Bạn có thể giả định rằng đối với một con tàu nhất định, luôn tồn tại một vị trí trên một bảng trống có kích thước nhất định.
Đầu ra
Nếu các vị trí tàu như vậy tồn tại, bạn phải xuất bất kỳ vị trí nào trong số chúng.
Chương trình phải xuất ra một ma trận phân tách dòng mới gồm các ký tự ascii thuộc một trong ba loại - một để biểu thị ô trống, một - một mảnh tàu và một - một ô được đánh dấu là "bị bỏ lỡ". Không có ký tự khác nên được xuất.
Ví dụ,
ZZ@Z
\@@Z
@\\Z
\Z\\
(Trong ví dụ này, tôi đã xác định @
là ô trống, là ô \
"bị bỏ lỡ" và Z
là mảnh tàu)
Nếu không có vị trí như vậy tồn tại, chương trình / chức năng sẽ trở lại mà không xuất ra bất cứ điều gì.
Đầu vào
Nếu bạn quyết định tạo một chương trình đầy đủ, bạn sẽ chỉ định cho bạn cách các danh sách được nhập, một số có thể đi qua các đối số, một số thông qua stdin.
Đây là môn đánh gôn , số lượng nhân vật chiến thắng thấp nhất.
Một ví dụ về giải pháp tối ưu hóa không chơi gôn có thể được tìm thấy ở đây
Biên dịch với -std=c99
, đối số đầu tiên là kích thước của bảng, các đối số khác là kích cỡ tàu. Một danh sách các bức ảnh được phân tách bằng dòng mới được đưa ra trên stdin. Thí dụ:
./a 4 1 1 1 <<< $'A2\nA4\nB3\nC3\nC4\D4'
10x10
với một con 4,3,2,1
tàu
26x26
? Tôi đã phác thảo một giải pháp dựa trên regexps và đệ quy, và nó trở nên cực kỳ chậm = không thể sử dụng cho các trường nhiều hơn6x6
. Hoặc tôi làm điều gì đó rất ngu ngốc, hoặc thiếu câu trả lời có nghĩa là những người khác cũng không có thành công.