VM 14 Bài 19 - Sudoku

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++, Java, Kotlin, Pascal, PyPy, Python, Scratch, TEXT

Sudoku là một trò chơi trí tuệ dành cho ~1~ người, được chơi trên bảng ~9 \times 9~, chia thành ~9~ hình vuông nhỏ ~3 \times 3~.

image

Ban đầu có một số ô của bảng chứa các chữ số ~1~ đến ~9~. Những ô còn lại rỗng.

Nhiệm vụ của người chơi Sudoku là điền các chữ số từ ~1~ đến ~9~ vào bảng, sao cho trong mỗi hàng, mỗi cột, và trong ~9~ ô vuông ~3 \times 3~ của bảng có đủ tất cả các chữ số từ ~1~ đến ~9~ (nói cách khác, mỗi chữ số từ ~1~ đến ~9~ xuất hiện đúng một lần trong mỗi hàng, mỗi cột, và trong ~9~ ô vuông ~3 \times 3)~.

Nhiệm vụ của bạn trong bài toán này hơi khác một chút: thay vì điền tiếp các chữ số vào bảng Sudoku, bạn cần tạo ra ~1~ bảng Sudoku hợp lệ (nghĩa là mỗi hàng, mỗi cột, và ~9~ ô vuông ~3 \times 3~ đều có đủ các chữ số từ ~1~ đến ~9)~.

Input

Bài này không có input

Output

In ra đúng ~9~ dòng, mỗi dòng gồm ~9~ ký tự là ~9~ chữ số của dòng tương ứng.

Giới hạn

  • Nếu bạn đưa ra một bảng Sudoku không hợp lệ, bạn được ~0~ điểm.

  • Ngược lại, điểm của bạn được tính như sau:

    • Gọi ô ở hàng ~u~, cột ~v~ là ô ~(u~, ~v)~.
    • Với mỗi số ~i~ từ ~1~ đến ~9~, ta định nghĩa ~sum(i) = \sum(|u-x| \times |v - y|)~ với tất cả các cặp ô ~(u, v)~ và ~(x, y)~ chứa số ~i~.
    • Điểm của bạn được tính theo công thức: $$\min(\left(max\left(0, \sum_{i = 1}^9 (sum(i) \times i) - 17000\right), 1062 \right)$$
  • Điểm càng cao càng tốt.

Sample Output

683459172
241673859
759182364
492836715
536217498
817594236
928361547
174925683
365748921

Note

Với output mẫu, ~sum(1) = 398~, ~sum(2) = 404~, ..., ~sum(9) = 374~. $$\sum_{i=1}^{9}(sum(i) \times i) = 17056$$ Điểm bạn nhận được là ~56~.


Bình luận

Hãy đọc nội quy trước khi bình luận.



  • -5
    dragon3012009  đã bình luận lúc 5, Tháng 12, 2024, 14:41 chỉnh sửa

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


  • 8
    vrski39  đã bình luận lúc 2, Tháng 12, 2024, 9:53 sửa 2

    bài này có sol 1062/1062 không vậy admin

    vì mình bruteforce không ra ;_;

    sol 1061 / 1062:

    bảng sudoku luôn có một tính chất đặc biệt, với một bảng sudoku đã điền, bạn có thể hoán đổi 2 số a và b và vẫn được một bàn sudoku hợp lệ khác

    đề yêu cầu tối đa tổng như kia, vì vậy, với một bàn sudoku đã điền đủ 9 vị trí, ta gán các số 9->1 theo thứ tự sum(i) nhỏ dần

    giờ với 1 bảng 9x9 rỗng, hãy tìm cách điền đủ 9 vị trí thoả mãn trong 1 bảng sudoku

    với 1 vị trí như vậy, ta tính trước được sum(i) của cách điền đó, vì vậy, hãy lưu tất cả các cách điền, sau đó sắp xếp giảm dần theo sum(i)

    vậy thì ta chỉ cần chọn 9 cách điền vừa khít là sẽ có một cách xếp 9->1 thoả mãn, có thể duyệt trâu

    để tối ưu duyệt trâu này, có thể làm thêm một số thứ như:

    2 số không bao giờ được điền chung 1 vị trí, vì vậy có thể dùng bitmask để kiểm tra nhanh

    ta có thể áng chừng được cận trên của tổng sum(i) * i khi đang điền, vì vậy có thể dùng nhánh cận để thoát sớm trong một cách điền không tối ưu

    phụ thuộc vào cách cài, có thể duyệt ra được sol 1061 trong time limit 1s


  • -9
    doanhdung55  đã bình luận lúc 14, Tháng 11, 2024, 14:56

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.