Ini adalah teka-teki umum yang telah Anda pecahkan secara manual. Sekarang ini saatnya untuk menulis algoritma untuk menyelesaikannya.
Ada batang korek api dengan jumlah yang sama dan berjajar di dua sisi yang berbeda menghadap ke arah masing-masing. Ada satu ruang kosong di antara mereka. Katakan sesuatu seperti gambar berikut (jika jumlah total batang korek adalah 4).
Setiap tongkat dapat meluncur satu langkah ke arah depan (jika ruang depan langsung bebas), atau dapat dilompati satu tongkat di depan mereka, dan mendarat ke ruang bebas (jika ruang itu gratis). Pergerakan ke arah sebaliknya tidak dimungkinkan (bahkan ruangnya gratis). Tidak ada reverse jump juga diperbolehkan. Hanya satu gerakan yang diizinkan dalam satu langkah.
Sekarang, Anda harus menulis sebuah algoritma untuk menemukan langkah-langkah minimum yang diperlukan dengan menggunakan mana semua batang korek api sisi kiri akan mendarat di sisi kanan dan semua batang korek api sisi kanan akan mendarat di sisi kiri.
Misalnya: Jika ada total 2 batang korek api (1 di setiap sisi) maka langkah-langkahnya adalah:
Catatan: Pada gambar di atas, tongkat sisi kiri dipindahkan terlebih dahulu. Solusi lain ada ketika tongkat sisi kanan bergerak terlebih dahulu. Tetapi untuk masalah ini, Anda harus memberikan hanya satu solusi dan itu juga dengan asumsi bahwa tongkat sisi kiri bergerak terlebih dahulu.
Gambar berikut menjelaskan gerakan dengan 4 batang korek api (2 di setiap sisi):
Catatan: Pada gambar di atas, tongkat sisi kiri dipindahkan terlebih dahulu. Solusi lain ada ketika tongkat sisi kanan bergerak terlebih dahulu. Tetapi untuk masalah ini, Anda harus memberikan hanya satu solusi dan itu juga dengan asumsi bahwa tongkat sisi kiri bergerak terlebih dahulu.
[Asumsi: Input dapat berupa angka genap antara 02 hingga 14 (yaitu 1 hingga 7 batang korek api di setiap sisi). Untuk input di luar rentang ini, Anda tidak perlu melakukan validasi apa pun, tidak perlu memberikan pesan kesalahan apa pun. Catatan: Dalam output, setiap langkah dipisahkan oleh '|' karakter (pipa). Programmer COBOL harus selalu menganggap PIC 9 (2) sebagai ukuran input & juga dapat menganggap output ditetapkan panjang maksimum 450 karakter, diisi dengan spasi di sebelah kanan.]
Input sampel:
02
Output sampel:
01To02|03To01|02To03|
Input sampel:
04
Output sampel:
02To03|04To02|05To04|03To05|01To03|02To01|04To02|03To04|
Input sampel:
06
Output sampel:
03To04|05To03|06To05|04To06|02To04|01To02|03To01|05To03|07To05|06To07|04To06|02To04|03To02|05To03|04To05|
sumber
Jawaban:
APL 129
Kode di bawah ini mengambil input dan output layar ke layar dalam format yang ditentukan:
Sepertiga yang baik dari kode diambil memformat output. Logikanya lengkap dengan kemunculan simbol ⋄ dalam kode.
Di bawah ini adalah hasil untuk input 08 sebagai cek:
sumber
Javascript
178 174161prompt
s untukn
kemudianalert
s jawaban. (Tidak ada0
bantalan)Terbaru:
2:
1:
Ini menggunakan konsep bahwa polanya dicerminkan:
Jadi, di mana
n=2
, pola pergerakannya adalah:Yang setara dengan
Pola ini berulang seperti (
n=8
)Kita dapat melihat beberapa pola di sini:
n/2
, yang berulang 3 kali, kemudian menurun kembali ke 1.1
, dan jumlah lompatan berurutan meningkat dari 1 hinggan/2
kemudian menurun kembali ke 1.n=14
:Output sampel:
f(2)
:f(8)
:f(40)
:Berikut beberapa kode semu untuk mendemonstrasikan metodenya:
sumber
l/L/r/R
danm/j
. Saya suka ide memisahkan jarak bergerak dari arahC -
216213Solusi saya didasarkan pada dua fakta:
Bidang "ke" adalah bidang "dari" dari langkah sebelumnya (karena Anda selalu membuat slot kosong di tempat Anda bergerak, dan Anda selalu pindah ke slot kosong)
Ada pola yang sangat teratur untuk jarak dan arah yang dipindahkan. Untuk 3 kasus uji pertama, mereka adalah:
1 -2 1
1 -2 -1 2 2 -1 -2 1
1 -2 -1 2 2 1 -2 -2 -2 1 2 2 -1 -2 1
Dengan pemikiran itu saya pada dasarnya hanya menulis sebuah program untuk menghasilkan dan melanjutkan pola itu. Saya cukup yakin pasti ada cara rekursif yang sangat indah dan jauh lebih elegan untuk menulis ini, tetapi saya belum menemukan jawabannya:
Dan bermain golf (meskipun ini tantangan kode, bukan golf):
sumber
scanf
. Saya memperbarui jawaban saya dengan versi yang lebih baik.N(2)=rLr
,N(4)=rLlRRlLr
,N(6)=rLlRRrLLLrRRlLr
, dllMathematica
Pendekatan ini membangun
Nest
urutan ukuran dan arah gerakan, yang diformat sebagai{fromPosition,toPosition}
, dimulai dengan posisin
, di manan
mengacu pada jumlah pasangan yang cocok. KemudianFold
urutan menjadi fungsi yang dimulai dengan bergerak{n, n+1}
.Memvisualisasikan Swaps
r
,,b
dano
merupakan gambar atau kecocokan merah, kecocokan biru, dan tanpa kecocokan, masing-masing.Berikut ini format keluaran dari
z
untuk menampilkan swap dengan kecocokan.swaps
menghasilkan daftar negara dengan menggunakan pasangan yang dipesanz
sebagai perintah untuk mengubah daftar awal dan daftar berikutnya.swapMatches
menampilkan status dalam kotak.sumber
Javascript 191
Karakter dihitung menggunakan
grep =|tr -d \ |wc -c
sumber
02
, nilainya benar, tetapi tidak ada jejaknya|
. Untuk dua kasus lainnya, nilainya jauh, dan format10
juga salah. Juga tidak yakin tentang metode penghitungan karakter Anda. Mengapa Anda hanya menghitung fungsi tubuh dikurangi pengembaliannya?tr -d \ |wc -c
memperhitungkan jalur - jalur baru