Bayangkan skenario berikut ini: Anda bermain kapal perang dengan seorang teman tetapi memutuskan untuk menipu. Daripada memindahkan kapal setelah dia menembak di tempat kapal Anda dulu, Anda memutuskan untuk tidak menempatkan kapal sama sekali. Anda memberi tahu dia bahwa semua tembakannya meleset, sampai tidak mungkin menempatkan kapal sedemikian rupa.
Anda harus menulis fungsi, atau program lengkap, yang entah bagaimana membutuhkan 3 argumen: ukuran bidang, daftar jumlah ukuran kapal, dan daftar tembakan.
Medan perang
Salah satu parameter yang diberikan adalah ukuran papan. Medan perang adalah kuadrat sel, dan parameter yang diberikan hanyalah satu sisi kuadrat.
Misalnya, berikut ini adalah papan ukuran 5.
Koordinat di lapangan ditentukan sebagai string 2-komponen: huruf diikuti oleh angka. Anda dapat mengandalkan huruf-huruf dalam beberapa kasus tertentu.
Surat menentukan kolom, nomor menentukan baris sel (1-diindeks). Misalnya dalam gambar di atas, sel yang disorot ditandai dengan "D2"
.
Karena hanya ada 26 huruf, bidang tidak boleh lebih besar dari 26x26.
Kapal
Kapal adalah garis lurus 1 atau lebih blok. Jumlah kapal ditentukan dalam daftar, di mana elemen pertama adalah jumlah kapal 1-sel, kedua - kapal 2-sel dan sebagainya.
Misalnya, daftar [4,1,2,0,1]
akan membuat kapal berikut:
Ketika ditempatkan di medan perang, kapal tidak dapat berpotongan, atau bahkan saling menyentuh. Bahkan dengan sudut. Namun mereka dapat menyentuh tepi lapangan.
Di bawah ini Anda dapat melihat contoh penempatan kapal yang valid:
Anda dapat mengasumsikan bahwa untuk kapal tertentu, selalu ada penempatan di papan kosong ukuran tertentu.
Keluaran
Jika penempatan kapal seperti itu ada, Anda harus mengeluarkannya.
Program ini harus mengeluarkan matriks yang dipisahkan dengan baris baru dari karakter ascii dari 3 jenis - satu untuk menunjukkan sel kosong, satu - potongan kapal, dan satu - sel yang ditandai sebagai "tidak terjawab". Tidak ada karakter lain yang harus di-output.
Sebagai contoh,
ZZ@Z
\@@Z
@\\Z
\Z\\
(Dalam contoh ini, saya mendefinisikan @
sel kosong, sel \
"terlewatkan", danZ
menjadi bagian kapal)
Jika tidak ada penempatan seperti itu, program / fungsi harus kembali tanpa mengeluarkan apa pun.
Memasukkan
Jika Anda memutuskan untuk membuat program full-blown, terserah Anda menentukan bagaimana daftar tersebut diinput, beberapa mungkin melalui argumen, beberapa melalui stdin.
Ini adalah kode-golf , jumlah karakter terendah yang menang.
Contoh solusi dioptimalkan non-golf dapat ditemukan di sini
Kompilasi dengan -std=c99
, argumen pertama adalah ukuran papan, argumen lain adalah ukuran kapal. Daftar pemotretan yang dipisahkan baris baru diberikan pada stdin. Contoh:
./a 4 1 1 1 <<< $'A2\nA4\nB3\nC3\nC4\D4'
10x10
yang 4,3,2,1
dihitung secara instan setidaknya dengan shipet
26x26
? Saya membuat sketsa solusi berdasarkan regexps dan rekursi, dan itu menjadi sangat lambat = tidak dapat digunakan untuk bidang lebih dari6x6
. Entah saya melakukan sesuatu yang sangat bodoh, atau kurangnya jawaban berarti bahwa orang lain juga tidak berhasil.