ROB Bowden: Hi. Saya Rob, dan saya berharap anda permainan untuk permainan 15. Sekarang, terdapat empat fungsi yang anda perlu untuk melaksanakan program ini - init, menarik, bergerak, dan menang. Jadi, mari kita lihat init. Di sini, kita melihat perkara yang pertama kita akan lakukan adalah mengisytiharkan pembolehubah dipanggil kaunter. Ia akan dimulakan untuk d kali d tolak 1. Ingat bahawa d ialah dimensi lembaga Pengarah kami. Bagaimana init akan bekerja adalah ia akan untuk melelar atas seluruh lembaga dan kita akan memulakan di sebelah kiri atas. Dan mari kita hanya mengatakan bahawa kita mempunyai 4 oleh 4 kapal. Jadi sebelah kiri kami akan katakan adalah 15. Dan kemudian kami hanya akan mengira menerusi papan, mengatakan 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, dan sebagainya. Jadi sebelah kiri atas, kami menjangka akan d kali d tolak 1, yang pada 4 oleh 4 kes akan menjadi 16 tolak 1, iaitu dengan betul 15. Dan kini di sini di mana kita akan melelar atas seluruh lembaga. Dan kita akan menetapkan setiap kedudukan dalam lembaga untuk nilai semasa kaunter, dan kemudian kaunter akan untuk SUSUTAN, supaya seterusnya kedudukan kita mencapai akan mempunyai kaunter menjadi salah satu kurang daripada kedudukan sebelumnya. Oleh itu, kita pada mulanya mempunyai 15 dan SUSUTAN kaunter. Demikian maka kita akan menyerahhakkan 14 kepada kedudukan depan, kaunter susutan, dan kita akan diberikan 13, dan sebagainya. Akhir sekali, kita perlu mengendalikan sudut yang kes di mana, jika lembaga mempunyai walaupun dimensi, maka hanya melakukan 15, 14, 13, 12, semua jalan ke 3, 2, 1, adalah akan meninggalkan kita dengan lembaga tidak dapat diselesaikan. Dan kita perlu menukar 1 dan 2. Jadi, jika d arena 2 sama dengan 0, itu bagaimana kita akan memeriksa untuk melihat jika ia lebih. Jika d arena 2 sama dengan 0, maka berturut-turut d tolak 1, iaitu baris bawah, dan kedudukan d tolak 2, atau lajur d tolak 2, kita akan menetapkan bahawa untuk 2, dan ruangan d tolak 3 kami akan menetapkan kepada 1. Jadi yang hanya menterbalikkan mana 1 dan 2 pada masa ini adalah. Akhir sekali, kita akan menetapkan sangat bawah hak yang sama rata untuk kosong, di mana kosong telah hash ditakrifkan di bahagian atas sebagai 0. Jadi, yang tidak tegas perlu, kerana ini untuk gelung akan mempunyai terletak betul-betul bahagian bawah ke 0, kerana kaunter secara semula jadi akan mencapai 0. Tetapi itu bergantung kepada kita mengetahui bahawa kosong telah dicincang untuk mencari 0. Jika saya pergi ke program ini dan kemudian menukar kosong di bahagian atas untuk 100, ia masih harus bekerja. Jadi ini hanya memastikan bahawa kanan bawah adalah sebenarnya sama dengan kita nilai kosong. Akhir sekali, kita mempunyai dua pembolehubah global, i dan kosong j supaya kosong, dan kita lihat mereka diisytiharkan di bahagian atas. Dan kita akan menggunakan kedua-dua global pembolehubah untuk mengesan kedudukan kosong, supaya kita tidak perlu melihat melalui keseluruhan lembaga untuk mencari yang kosong setiap tunggal kali kita cuba untuk membuat satu langkah. Jadi kedudukan kosong sentiasa adalah akan mula di sebelah kanan bawah. Jadi kanan bawah diberikan oleh indeks d tolak 1, d tolak 1. Jadi, itulah init. Sekarang kita beralih untuk menarik. Jadi, cabutan akan menjadi sama di mana kita akan melelar atas seluruh lembaga. Dan kita hanya mahu mencetak nilai yang di setiap posisi lembaga. Jadi di sini, kita mencetak nilai itulah pada setiap kedudukan lembaga. Dan melihat bahawa kita lakukan -. Dan itu hanya memberitahu printf yang tidak kira jika ia adalah satu angka satu atau dua digit, kita masih mahu ia mengambil dua tiang di cetak keluar, supaya jika kita mempunyai dua digit dan satu nombor digit pada papan yang sama, kami papan masih akan kelihatan bagus dan persegi. Oleh itu, kita mahu berbuat demikian untuk setiap nilai dalam lembaga, kecuali kosong. Jadi, jika kedudukan dalam lembaga sama kosong, maka kita secara khusus ingin mencetak hanya garis bawah untuk mewakili kosong, bukan apa sahaja nilai kosong sebenarnya. Akhir sekali, kita ingin mencetak keluar barisan baru. Perhatikan bahawa ini adalah masih di dalam luar untuk gelung, tetapi di luar dalam untuk gelung. Sejak luar ini untuk gelung iterating ke atas semua baris, dan sebagainya printf ini akan hanya mencetak barisan baru, jadi kita bergerak untuk mencetak barisan seterusnya. Dan itu sahaja untuk cabutan. Jadi, mari kita beralih untuk bergerak. Sekarang, kita lulus bergerak, jubin bahawa pengguna dimasukkan dalam permainan - mereka memasukkan jubin yang mereka mahu untuk bergerak - dan anda sepatutnya kembali bool, jadi sama ada benar atau salah, bergantung kepada sama ada langkah yang sebenarnya sah - sama ada jubin yang boleh berpindah ke ruang yang kosong. Jadi di sini, kita mengisytiharkan pembolehubah tempatan, tile_1 dan tile_j, yang akan sama dengan blank_i dan blank_j, kecuali ia akan mengesan kedudukan jubin. Sekarang di sini, kita akan menggunakan blank_i dan blank_j dan berkata semua betul, jadi inilah kosong di papan. Sekarang, adalah jubin di atas kosong? Adakah jubin di sebelah kiri kosong? Adakah jubin di sebelah kanan kosong? Adakah jubin di bawah kosong? Jadi, jika jubin adalah dalam mana-mana kedudukan, maka kita tahu bahawa jubin boleh berpindah ke tempat yang kosong dan kosong yang boleh dipindahkan ke mana jubin kini. Jadi di sini, kita katakan jika lembaga pada kedudukan blank_i tolak 1 blank_j. Jadi ini mengatakan adalah jubin di atas kosong semasa? Dan jika demikian, kita akan ingat yang kedudukan jubin. Jubin yang berada dalam kedudukan blank_i tolak 1 dan blank_j. kini pertama, kami juga mempunyai semak ini di sini, jadi blank_i adalah lebih besar daripada 0. Mengapa kita mahu berbuat demikian? Nah, jika kosong adalah di baris atas lembaga, maka kita tidak mahu melihat di atas kosong untuk jubin sejak ada apa-apa di atas bahagian atas deretan papan. Ini adalah bagaimana anda mungkin berakhir mendapat sesuatu seperti bersalah segmentasi atau program anda hanya mungkin bekerja dalam cara yang tidak dijangka. Jadi, ini adalah memastikan bahawa kita tidak melihat di tempat-tempat yang tidak sah. Sekarang kita akan melakukan perkara yang sama untuk semua kemungkinan kombinasi yang lain. Jadi di sini, kita sedang mencari di bawah kosong untuk melihat jika itu jubin. Dan kita juga perlu memastikan kami tidak pada baris bawah, jika tidak kita tidak perlu mencari jubin. Di sini, kita akan melihat di sebelah kiri kosong untuk melihat jika ia jubin. Dan kita tidak perlu melihat ke kiri jika kita dalam ruang paling kiri. Dan di sini kita akan melihat kepada kanan kosong, dan kita tidak harus melihat ke kanan jika kita dalam ruang paling kanan. Jadi, jika tidak ada perkara-perkara benar, bermakna jubin tidak bersebelahan kepada kosong dan kita boleh kembali palsu. Langkah itu tidak sah. Tetapi, jika salah seorang daripada mereka itu benar, maka di ketika ini, kita tahu tile_i itu dan tile_j adalah sama dengan kedudukan jubin. Dan sebagainya, kita boleh mengemas kini lembaga di jawatan tile_i dan tile_j. Kita tahu nilai baru akan menjadi kosong dan bahawa blank_i kedudukan blank_j, yang asal kosong - kami tahu jubin akan bergerak di sana. Notis kita sebenarnya tidak perlu melakukan swap sebenar di sini, kerana kita tahu nilai-nilai yang perlu dimasukkan ke dalam kedudukan itu. Kami tidak memerlukan sementara berubah-ubah sekitar. Akhir sekali, kita perlu ingat kita yang mempunyai pembolehubah global kami yang mengesan kedudukan daripada kosong. Oleh itu, kita ingin mengemaskini kedudukan kosong untuk di mana jubin asalnya adalah. Akhir sekali, kita kembali benar kerana langkah itu berjaya. Kami telah berjaya menukar kosong dengan jubin. Baiklah, kita jadi lepas perlu menyemak won. Jadi, memenangi juga kembali bool di mana benar akan menunjukkan bahawa pengguna telah memenangi permainan. Dan palsu yang menunjukkan bahawa permainan ini masih berterusan. Pengguna tidak menang. Jadi, ini akan menjadi cukup banyak bertentangan dengan INIT, di mana INIT, ingat, kita memulakan lembaga 15, 14, 13, 12, sebagainya. Manakala menang, kita mahu untuk memeriksa jika lembaga adalah 1, 2, 3, 4, 5, dan sebagainya. Jadi, kita akan memulakan kami melawan untuk 1 kerana itulah yang utama di kiri lembaga harus. Dan kemudian kita akan gelung atas seluruh lembaga. Mari kita mengabaikan keadaan ini untuk kali kedua. Dan keadaan ini hanya akan cek adalah lembaga pada kedudukan ini sama dengan tuduhan semasa? Jika ya, kenaikan kiraan supaya kedudukan seterusnya kita melihat adalah salah satu yang lebih tinggi daripada kedudukan kita berada di sekarang. Jadi itulah bagaimana kita mendapat kiri atas adalah 1 orang. Kenaikan kiraan untuk 2. Lihatlah kedudukan seterusnya. Adakah ini 2? Jika ya, kenaikan kiraan 3. Kedudukan Seterusnya, adakah ini 3? Jika ya, kenaikan kiraan untuk 4, dan sebagainya. Jadi, jika ada apa-apa kedudukan di lembaga yang tidak sama kiraan kita, maka kita mahu kembali palsu kerana itu bermakna ada beberapa jubin yang tidak dalam kedudukan yang betul. Jadi di sini, apa yang keadaan ini lakukan? Nah, ingat bahawa kosong itu sepatutnya pergi di sebelah kanan bawah. Dan nilai kosong tidak mungkin semestinya bersamaan dengan nilai melawan yang akan dicapai di sebelah kanan bawah. Oleh itu, kita secara khusus mahu untuk memeriksa jika i sama sama d tolak 1 dan j setaraf sama d tolak 1 - yang mengatakan jika kita mencari di kanan bawah lembaga - maka kita hanya mahu terus. Kami mahu melangkau ini tertentu lelaran untuk gelung. Justeru, jika kita berjaya melalui ini bersarang untuk gelung, ini bermakna bahawa tiada jubin yang di dalam kedudukan yang tidak betul. Dan kita keluar daripada gelung dan datang di sini, di mana kita boleh kembali benar. Semua jubin berada di kedudukan yang betul dan itu bererti pengguna mempunyai memenangi permainan. Dan itu sahaja. Nama saya Rob Bowden, dan ini adalah 15.