Optimalisasi algoritma backtracking untuk semua jalur dalam grid dari kiri atas ke kanan bawah mengunjungi setiap kotak hanya satu kali

Rumusan masalah: Hitung jumlah jalur dalam grid nxn dari sudut kiri atas ke sudut kanan bawah sehingga jalur tersebut mengunjungi setiap kotak tepat satu kali. Misalnya, dalam grid 7£7, terdapat 111712 jalur seperti itu.

Algoritma dan optimasi: Kita mulai dengan algoritma backtracking langsung, dan kemudian mengoptimalkannya langkah demi langkah menggunakan observasi tentang bagaimana pencarian dapat dipangkas.

Ini adalah bagian yang saya tidak mengerti:

Optimasi 1: Dalam solusi apa pun, pertama-tama kita bergerak satu langkah ke bawah atau ke kanan. Selalu ada dua jalur yang simetris terhadap diagonal grid setelah langkah pertama. Oleh karena itu, kita dapat memutuskan bahwa pertama-tama kita selalu bergerak satu langkah ke bawah (atau ke kanan), dan akhirnya mengalikan jumlah solusi dengan dua.

Saya memahami bahwa akan ada solusi simetris sehingga kita cukup mencari setengahnya dan mengalikan angkanya dengan 2. Namun bagaimana kita menerapkannya?


Apa arti kalimat ini?:

Oleh karena itu, kita dapat memutuskan bahwa kita selalu bergerak ke bawah (atau ke kanan) terlebih dahulu.

Apakah ini berarti pergerakan pertama akan selalu ke bawah (atau ke kanan)? Pada dasarnya mengatur langkah pertama untuk rekursi dasar? Atau apakah itu berarti melakukan hal itu untuk setiap langkah rekursif? Atau apakah itu berarti sesuatu yang sama sekali berbeda. Saya mengalami banyak masalah dalam pemahaman. Mohon jelaskan secara detail.


person Just another person    schedule 13.08.2020    source sumber
comment
Dikatakan bahwa Anda hanya dapat memperbaiki langkah pertama agar selalu turun. Ini juga cara Anda menerapkannya. Ini mengurangi jumlah jalur yang perlu Anda temukan sebanyak 2 kali lipat   -  person shananton    schedule 13.08.2020


Jawaban (1)


Untuk setiap jalur (misalnya RDDRRD) ada jalur cermin tempat Anda menukar D dan R (misalnya DRRDDR). Teks tersebut mengatakan bahwa jika Anda menemukan semua jalur yang dimulai dengan D, Anda dapat dengan mudah menghasilkan semua jalur yang dimulai dengan R dengan melakukan inversi.

Jadi, Anda cukup berasumsi huruf pertama adalah D dan mengalikan jumlah jalur yang dihasilkan dengan 2.

Untuk solusi yang melibatkan pemrograman dinamis hal ini tidak akan membuat banyak perbedaan, tetapi untuk solusi backtracking yang naif ini adalah faktor 2!

person Botje    schedule 13.08.2020