Google Code Jam 2018 - Waffle Choppers

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: 1400 Thời gian: 1.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

Các thực khách tại Ngôi nhà Bánh kếp Vô hạn đã chán bánh kếp hình tròn, nên các đầu bếp sắp đưa ra một lựa chọn mới trong thực đơn: bánh waffle! Để quảng bá, họ đã làm một chiếc waffle lớn có dạng lưới ô vuông gồm \(R\) hàng và \(C\) cột. Mỗi ô của chiếc waffle hoặc trống, hoặc chứa đúng một hạt sô-cô-la.

Giờ là lúc các đầu bếp chia chiếc waffle cho những thực khách đang đói. Một đường cắt ngang chạy dọc toàn bộ đường lưới nằm giữa hai hàng; một đường cắt dọc chạy dọc toàn bộ đường lưới nằm giữa hai cột. Để làm việc hiệu quả, một đầu bếp sẽ thực hiện đúng \(H\) đường cắt ngang khác nhau và một đầu bếp khác sẽ thực hiện đúng \(V\) đường cắt dọc khác nhau. Nhờ đó, họ tạo ra đúng một miếng cho mỗi người trong số \((H+1)\times(V+1)\) thực khách. Các miếng không nhất thiết có cùng kích thước, nhưng điều đó không sao; nghiên cứu thị trường cho thấy thực khách không quan tâm đến chuyện này.

Điều thực khách quan tâm là số hạt sô-cô-la họ nhận được, vì vậy mỗi miếng phải có chính xác cùng một số hạt sô-cô-la. Bạn có thể xác định liệu các đầu bếp có đạt được mục tiêu này với số đường cắt ngang và dọc đã cho hay không?

Dữ liệu vào

Dòng đầu tiên chứa số lượng bộ test \(T\); tiếp theo là \(T\) bộ test. Mỗi bộ bắt đầu bằng một dòng chứa bốn số nguyên \(R\), \(C\), \(H\), \(V\): số hàng và số cột của chiếc waffle, cùng số đường cắt ngang và dọc chính xác mà các đầu bếp phải thực hiện. Sau đó có thêm \(R\) dòng, mỗi dòng gồm \(C\) ký tự; ký tự thứ \(j\) trên dòng thứ \(i\) biểu diễn ô ở hàng \(i\), cột \(j\) của chiếc waffle. Mỗi ký tự là @, nghĩa là ô đó có một hạt sô-cô-la, hoặc ., nghĩa là ô đó trống.

Dữ liệu ra

Với mỗi bộ test, in một dòng Case #x: y, trong đó x là số thứ tự bộ test (bắt đầu từ 1), còn yPOSSIBLE nếu các đầu bếp có thể đạt mục tiêu như mô tả ở trên, hoặc IMPOSSIBLE nếu không thể.

Ràng buộc

  • \(1\le T\le100\).

Phân nhóm

Test Set 1 (Hiển thị):

  • \(2\le R\le10\).
  • \(2\le C\le10\).
  • \(H=1\).
  • \(V=1\).

Test Set 2 (Ẩn):

  • \(2\le R\le100\).
  • \(2\le C\le100\).
  • \(1\le H<R\).
  • \(1\le V<C\).

Điểm các phân nhóm

Mỗi Test Set tương ứng với một subtask trên LQDOJ. Bảng dưới đây giữ nguyên điểm chính thức của Google Code Jam và quy đổi tỷ lệ trên tổng điểm của bài.

Phân nhóm Điểm Google Code Jam Tỷ lệ điểm của bài
Test Set 1 9/25 36%
Test Set 2 16/25 64%

Ví dụ

Ví dụ 1

Input
6
3 6 1 1
.@@..@
.....@
@.@.@@
4 3 1 1
@@@
@.@
@.@
@@@
4 5 1 1
.....
.....
.....
.....
4 4 1 1
..@@
..@@
@@..
@@..
3 4 2 2
@.@@
@@.@
@.@@
3 4 1 2
.@.@
@.@.
.@.@
Output
Case #1: POSSIBLE
Case #2: IMPOSSIBLE
Case #3: POSSIBLE
Case #4: IMPOSSIBLE
Case #5: POSSIBLE
Case #6: IMPOSSIBLE
Giải thích

Lưu ý rằng hai bộ test ví dụ cuối cùng sẽ không xuất hiện trong Test Set 1.

Trong Ví dụ #1, một chiến lược khả thi là cắt ngang giữa hàng thứ hai và thứ ba tính từ trên xuống, rồi cắt dọc giữa cột thứ tư và thứ năm tính từ trái sang. Cách đó tạo ra các miếng sau, mỗi miếng có đúng hai hạt sô-cô-la:

.@@. .@
.... .@

@.@. @@

Trong Ví dụ #2, bất kể đặt đường cắt ngang và đường cắt dọc ở đâu, bạn cũng tạo ra các miếng có số hạt sô-cô-la không bằng nhau, nên trường hợp này là không thể.

Trong Ví dụ #3, chiếc waffle không có hạt sô-cô-la nào. Mọi chiến lược cắt đều tạo ra các miếng có cùng số hạt sô-cô-la (bằng 0), nên các thực khách hài lòng... nhưng có lẽ không hài lòng bằng khi họ nhận được sô-cô-la!

Trong Ví dụ #4, cũng như Ví dụ #2, bạn không thể thành công bất kể đặt đường cắt ngang và đường cắt dọc ở đâu.

Trong Ví dụ #5, các đầu bếp có thể thực hiện cả hai đường cắt ngang khả dĩ duy nhất, rồi đặt hai đường cắt dọc ngay bên phải cột thứ nhất và cột thứ ba.

Mặc dù Ví dụ #6 có thể khả thi với số đường cắt ngang và dọc khác, hãy nhớ rằng bạn phải dùng đúng \(H\) đường cắt ngang và đúng \(V\) đường cắt dọc. Bất kể đặt một đường cắt ngang và hai đường cắt dọc ở đâu, bạn cũng không thể thành công.

Nguồn

Google Code Jam 2018, Vòng 1A, bài Waffle Choppers.

Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.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: