Bisakah persegi panjang ini mengisi ruang persegi panjang?
Diberikan banyak persegi panjang, Anda ditanya apakah mereka dapat diatur untuk mengisi ruang persegi panjang atau tidak.
Spesifikasi
Diberikan sekelompok m x n
persegi panjang sewenang-wenang ; 0 <= m, n <= 1000
, tentukan apakah mungkin untuk mengaturnya sehingga mereka menutupi area persegi persis tanpa lubang atau tumpang tindih. Persegi panjang tidak dapat diputar, dan masing-masing persegi panjang hanya dapat ditempatkan satu kali.
Memasukkan
Input untuk ini sangat fleksibel, selama input memberikan semacam daftar dimensi 2-ruang. Misalnya, kedua hal berikut ini valid:
Dipisahkan oleh Space, Return
1 2
1 5
4 5
3 6
Daftar Dimensi
[[1, 2], [1, 5], [4, 5], [3, 6]]
Keluaran
Semacam nilai true / false seperti true / false, 0/1, T / F, True / False, dll. Jika Anda akan menggunakan metode output yang tidak terlalu jelas, harap sebutkan dalam jawaban Anda.
Contohnya
Test Case 1
Memasukkan:
1 1
1 5
2 6
Output:
true
(atau yang serupa)
Bagaimana mengaturnya:
XYYYYY
ZZZZZZ
ZZZZZZ
Test Case 2
Memasukkan:
1 1
2 2
Keluaran:
false
(atau yang serupa)
Penjelasan: Menjadi jelas bahwa Anda tidak dapat mengatur dua kotak dengan ukuran yang berbeda dan membuat tepinya sejajar.
Test Case 3
Memasukkan:
1 1
1 2
1 2
2 1
2 1
Output:
true
(atau yang serupa) Bagaimana mengaturnya:
AAB
DEB
DCC
Seperti yang ditunjukkan oleh @ETHProductions, untuk semua kasus uji lainnya, Anda dapat terus menggabungkan persegi panjang dengan panjang tepi umum hingga Anda hanya memiliki satu persegi panjang, jadi kotak uji ini hanya untuk memecahkan kode yang menggunakan ide ini.
Test Case 4
Memasukkan:
3 2
4 1
2 1
4 1
2 1
5 2
3 2
1 4
3 2
2 1
2 1
1 1
5 1
Output:
true
(atau yang serupa)
Bagaimana mengaturnya:
AAABBBBEE
AAACCDDDD
FFFFFGGGH
FFFFFGGGH
IIIJJKKLH
IIIMMMMMH
Catatan : Anda tidak perlu menyatakan bagaimana mengaturnya, Anda hanya perlu menentukan apakah tidak dapat diatur.
Ini adalah kode golf, jadi jawaban tersingkat dalam byte menang! Saya akan menerima jawaban terpendek pada 14 Januari, tetapi jangan ragu untuk mengirimkan jawaban lebih lambat dari itu karena saya masih bisa memberikan suara! :)
Selamat bermain golf!
~ AL
PS Jika Anda tahu tag apa yang harus diterapkan untuk masalah ini, silakan tambahkan, saya sama sekali tidak tahu apa yang harus dimasukkan sebagai tag selain kode-golf.
EDIT : Program Anda harus dapat memproses hingga 25 persegi panjang, dalam waktu paling lama 10 detik pada komputer yang layak (saya akan cukup fleksibel pada aturan ini).
EDIT : Saya telah memperpanjang batas waktu penerimaan pengiriman hingga hari terakhir tahun ini, tetapi saya ragu saya akan mendapatkan jawaban saat itu ...
EDIT : Saya telah memperpanjang batas waktu penerimaan pengiriman 2 minggu, jadi jika tidak ada lagi jawaban yang masuk saat itu, jawaban C saat ini akan diterima! :)
sumber
[[1, 2], [2, 1], [1, 1], [1, 2], [2, 1]]
(yang dapat diaturABB ACD EED
). Anda mungkin ingin menambahkan test case sederhana ini.Jawaban:
C, 1135
115812311598byteYah, ini sudah melewati batas waktu yang ditentukan, tetapi melihat bagaimana belum ada jawaban, inilah satu (agak panjang) di C.
Pengembalian:
Memperbarui:
Kode asli bisa macet pada beberapa matriks, membutuhkan waktu lebih lama dari 10s yang diizinkan. Revisi saat ini harus menyelesaikan semua matriks di bawah 1s. Ini dilakukan dengan 1) Menyortir persegi panjang input dan 2) melewatkan ukuran berulang saat pemasangan.
Golf:
Tidak Disatukan:
Penjelasan: Kami memiliki 6 fungsi:
main
,O
,Q
,F
,L
danT
.T
t EST untuk melihat apakah ada ruang untuk persegi panjang di tempat tertentu.L
fil l s persegi panjang ke output buffer atau, secara bergantian menghilangkan satu dengan Timpa.O
danQ
membangun dinding kiri dan atas, masing-masing danF
f penyakit sisa persegi panjang dengan pencarian berulang.Meskipun pencarian dasar bersifat iteratif, kami menghilangkan sebagian besar kemungkinan vektor pencarian, pertama dengan membangun kombinasi lebar dan tinggi yang diizinkan untuk persegi panjang master dan kemudian menghilangkan konfigurasi yang tidak mungkin. Kecepatan tambahan dapat diperoleh dalam persegi panjang yang lebih besar dengan menentukan dinding bagian bawah dan kanan sebelum mengisi pusat tetapi tidak diperlukan untuk kecepatan yang layak ketika membatasi hingga 25 persegi panjang interior.
sumber
Haskell, 226 byte
Cobalah di Ideone
Bagaimana itu bekerja
Ini secara rekursif mencari semua kemiringan parsial yang bentuknya adalah diagram Young , menambahkan satu persegi panjang pada suatu waktu, dan memeriksa apakah salah satu hasil akhirnya adalah persegi panjang.
Untuk melihat bahwa setiap ubin persegi panjang dapat dibangun dengan cara ini: dalam setiap ubin diagram Young yang kosong, misalkan R adalah himpunan persegi panjang di ubin yang sudut barat dayanya tidak menyentuh persegi panjang lainnya. Karena setiap simpul cekung dari diagram Young adalah berbatasan-tepi (tidak hanya berbatasan sudut) dengan paling banyak satu persegi panjang di R, dan jumlah simpul cekung ini adalah satu kurang dari jumlah persegi panjang di R, harus ada setidaknya satu persegi panjang di R yang berbatasan dengan tidak ada dari simpul cekung ini. Menghapusnya menghasilkan diagram Young lain, sehingga kita dapat melanjutkan dengan induksi.
sumber