Rumah > Artikel > tutorial komputer > Bagaimana untuk menulis program bahasa C untuk menyelesaikan masalah Menara Hanoi
Sebenarnya, terdapat tiga langkah utama:
Mula-mula, gerakkan cakera n-1 pada a ke b hingga c.
Kedua, gerakkan cakera bawah pada a ke c.
Ketiga, memandangkan plat n-1 yang pertama semuanya berada pada tiang b, kita hanya perlu menganggap tiang b sebagai tiang a dan ulangi langkah di atas.
#include
Mari ketahui cara menyelesaikan teka-teki. Semasa teka-teki kita boleh menggunakan fungsi untuk menggerakkan pinggan. Prototaip fungsi ialah "void move(int n, char a, char b, char c)". Di dalam fungsi, kita boleh menggunakan rekursi untuk menggerakkan plat. Dengan menyatakan bilangan plat n dan pengecam bagi tiga tiang a, b, c, kita boleh menggerakkan plat dari tiang a ke tiang c mengikut turutan. Idea rekursi
{
jika(n==1)
printf("t%c->%cn", a, c); // Apabila hanya ada satu plat, gerakkan plat terus dari a ke c
lain
{
Untuk membantu pemain yang belum melepasi tahap itu, mari kita belajar tentang kaedah penyelesaian teka-teki yang khusus. Dalam proses menyelesaikan teka-teki, kita boleh menggunakan kaedah rekursif Operasi khusus adalah seperti berikut: 1. Gerakkan plat n-1 dari tiang a ke tiang c: gerakkan(n-1, a, c, b); 2. Gerakkan plat ke-n dari tiang a ke tiang b; 3. Tempat n
Untuk membantu pemain yang belum menyelesaikan teka-teki lagi, kami boleh menggunakan kod berikut untuk menyelesaikan masalah: printf("t%c->%cn",a,c);
Untuk membantu pemain yang belum melepasi tahap ini, mari lihat langkah khusus untuk menyelesaikan teka-teki. Pertama, kita boleh memindahkan plat n-1 pertama dari lajur B ke lajur A, supaya lajur B menjadi lajur permulaan, dan kemudian memindahkan plat pada lajur B ke lajur C melalui lajur A.
}
}
int main()
{
int n;
printf ("Sila masukkan bilangan blok untuk dialihkan:");
scanf("%d",&n);
gerak(n,'a','b','c');
kembali 0;
}
Saya baru buat semalam.
#include
void main() { int m; printf("Sila masukkan bilangan tingkat menara:"); scanf("%d",&m); printf("Sila ikuti langkah berikut: n"); hanoi(m,'1','2','3'); }
void hanoi(int n,char satu,char dua,char tiga) { void move(char x,char y); if(n==1) move(satu,tiga); ,tiga,dua);
Saya akan berkongsi dengan anda fungsi pergerakan mudah yang boleh membantu anda melakukan operasi pergerakan dalam permainan. Fungsinya adalah seperti berikut: pergerakan kosong(char x, char y) { printf("%c--->%cn", x, y); } Fungsi ini menerima dua parameter, mewakili kedudukan semasa dan kedudukan sasaran. Ia akan mencetak proses bergerak supaya anda boleh menjejaki laluan bergerak. Anda boleh memanggil fungsi ini untuk melakukan operasi pergerakan mengikut keperluan. Saya harap fungsi ini dapat membantu anda melepasi tahap!Cara memprogram Arhat Tower dalam bahasa C
Program saya di bawah:
Di bawah ialah fungsi untuk membantu anda menyelesaikan teka-teki, ia boleh digunakan untuk mengalihkan sub-blok atas dari satu menara ke menara yang lain. ```C++ void NuoYiWei(int FromTa, int ToTa) { //Tulis kod anda di sini untuk mengalihkan sub-blok teratas daripada FromTa ke ToTa. } ``` Anda boleh beroperasi berdasarkan fungsi ini dan menulis kaedah penyelesaian teka-teki anda mengikut peraturan permainan dan keperluan teka-teki tertentu. Ingatlah untuk mendasarkannya pada realiti
{
TopPoint[FromTa] ialah tatasusunan yang merekodkan ketinggian setiap aras menara. Apabila elemen dikeluarkan dari menara, ketinggian menara dikurangkan sebanyak satu unit. Tujuan tatasusunan ini adalah untuk membantu kami menjejaki ketinggian semasa setiap menara.
Untuk menyelesaikan masalah ini, kita boleh menggunakan kod berikut untuk merekod data tiga menara dan memindahkan data dari satu menara ke menara yang lain: ```python DuiZhan[ToTa][TopPoint[ToTa]] = DuiZhan[FromTa][TopPoint[FromTa]] ``` Baris kod ini akan mengambil data dari bahagian atas menara yang dialihkan (FromTa) dan memindahkannya ke bahagian atas menara yang dialihkan (ToTa). Dengan cara ini kita boleh log dan memindahkan data pada menara.
DuiZhan[FromTa][TopPoint[FromTa]] = 0; //Pulihkan aras teratas menara asal menjadi kosong. Sekarang mari kita lihat kaedah penyelesaian teka-teki khusus untuk membantu pemain yang belum melepasi tahap itu.
Untuk membantu pemain yang belum melepasi tahap itu, mari kita belajar tentang kaedah penyelesaian teka-teki khusus. Salah satu langkah utama ialah mengalihkan menara ke kedudukan sasaran Operasi khusus adalah untuk menambah bilangan tingkat menara sasaran sebanyak 1 melalui kod "TopPoint[ToTa]++;" Langkah ini merupakan bahagian penting dalam proses penyelesaian teka-teki, dan saya harap ia akan membantu semua orang melepasi tahap dengan lancar.
}
Fungsi
void Nuo(int FromTa, int MidTa, int ToTa, int NeedMove) ialah penyelesaian utama kepada masalah Menara Hanoi. Kita boleh menggunakan fungsi ini untuk menyelesaikan masalah Menara Hanoi memandangkan keadaan awal dan ketinggian menara.{
Mari kita lihat kaedah penyelesaian teka-teki khusus. Apabila ketinggian menara yang perlu dialih lebih besar daripada atau sama dengan 2 tingkat, kita boleh melakukan operasi berikut:
{
Nuo(FromTa, ToTa, MidTa, (NeedMove-1)); //Alihkan semua N-1 atas kecuali bahagian bawah ke menara tengah Langkah ini dicapai dengan memanggil fungsi secara rekursif. Semasa teka-teki, kita perlu menggunakan tiga menara (FromTa, ToTa dan MidTa) untuk menggerakkan plat. Mula-mula, kami mengalihkan plat N-1 teratas dari FromTa ke MidTa (dilaksanakan dengan memanggil fungsi secara rekursif). Kemudian, alihkan plat bawah dari FromTa ke ToTa. Akhir sekali, alihkan plat N-1 pada MidTa ke ToTa (juga dilaraskan secara rekursif
NuoYiWei(FromTa,ToTa); //Alihkan plat bawah dari menara permulaan ke menara sasaran.
Nuo(MidTa,FromTa,ToTa,(NeedMove-1)); //Akhir sekali, alihkan semua item N-1 yang dipindahkan ke menara tengah ke menara sasaran (dengan andaian fungsi ini boleh mencapai fungsi ini)
}
lain
{
Untuk membantu pemain yang belum melepasi tahap itu, mari kita belajar tentang kaedah penyelesaian teka-teki yang khusus. Jika hanya tinggal satu blok yang perlu dialihkan, alihkan sahaja.
}
}
Fungsi ini ditulis dalam C++ Sila ambil perhatian bahawa jika anda menggunakan bahasa C, anda perlu memberi perhatian kepada beberapa butiran.
Saya mempunyai program Tower of Hanoi yang ditulis dalam bahasa C Jika anda memerlukannya, anda boleh menghantar e-mel kepada saya ke sxt9840210@163.com dan menerangkan dengan jelas jenis program yang anda perlukan.
Saya sebelum ini menyimpan jawapan orang lain, sila lihat:
Idea teras algoritma rekursif adalah menggunakan matlamat penyelesaian sebagai titik permulaan dan secara beransur-ansur memanggil proses penyelesaiannya sendiri untuk menyelesaikan item yang tidak diketahui sehingga sempadan rekursi dicapai, iaitu keadaan awal. Kaedah ini berbeza dengan kaedah tradisional bermula dari keadaan awal, tetapi ia adalah salah satu cara yang berkesan untuk menyelesaikan masalah. Melalui algoritma rekursif, kita boleh menguraikan masalah kompleks secara beransur-ansur kepada sub-masalah mudah dan akhirnya memperoleh jawapan global. Kunci kepada rekursi adalah untuk menjelaskan sempadan rekursi dan memastikan bahawa proses rekursif boleh betul
Kunci untuk menyelesaikan masalah Menara Hanoi ialah menganalisis peraturan pergerakan, mencari corak dan menentukan keadaan sempadan.
Jika anda ingin memindahkan n plat dari A ke C, anda boleh mengikuti langkah berikut: (1) Pindahkan n-1 plat dari A ke B; (2) Pindahkan plat ke-n dari A ke C; -1 pinggan dari B ke C. Dengan memanggil fungsi secara rekursif, plat lain pada A boleh terus bergerak mengikut tiga langkah di atas sehingga keadaan sempadan n=1 dicapai. Dengan cara ini, tugasan itu boleh diselesaikan dengan jayanya! Saya harap kaedah teka-teki ini dapat membantu pemain yang belum melepasi tahap itu.
Apabila pemikiran anda jelas, program menjadi lebih mudah untuk difahami. Dalam program ini, kuncinya ialah menganalisis parameter setiap kali fungsi pergerakan dipanggil dan hubungan antara menara A, B dan C. Mari kita ilustrasikan dengan contoh praktikal di bawah.
Untuk membantu pemain yang masih belum menyelesaikan teka-teki, mari kita lihat dengan lebih dekat cara menyelesaikannya. Pertama, kita boleh menggunakan fungsi "move(int n, int x, int y, int z)" untuk melaksanakan operasi bergerak.
②{
③ jika (n==1)
Untuk membantu pemain yang belum melepasi tahap itu, mari kita belajar tentang kaedah penyelesaian teka-teki yang khusus. Saya telah menyediakan langkah-langkah berikut untuk anda: 1. Mula-mula, cari fungsi bernama printf. 2. Kemudian, masukkan "%c-->%cn" dalam kurungan fungsi printf, yang akan mencetak dua aksara dan membalut garisan. 3. Di dalam kurungan, hantarkan x dan z sebagai argumen kepada fungsi printf.
⑤ lain
⑥ {
⑦ bergerak(n-1,x,z,y);
Untuk membantu pemain melepasi tahap, mari kita lihat kaedah penyelesaian teka-teki yang khusus. Dalam kod tersebut, terdapat baris kod iaitu "printf("%c-->%cn",x,z);". Fungsi baris kod ini adalah untuk mencetak hubungan antara aksara x dan aksara z. Dengan memerhatikan hasil cetakan, kami boleh mendapatkan beberapa petunjuk untuk membantu kami menyelesaikan teka-teki.
⑨ {getchar();}//Adakah ayat ini perlu? Rasa macam boleh ditanggalkan
⑩ bergerak(n-1,y,x,z);
}
}
Sebagai contoh, terdapat 4 pinggan, dan kini semuanya diletakkan di Menara A. Jejari plat lebih besar mengikut nombor 1, 2, 3, dan 4. Sekarang alihkan 4 plat ke C dan susunkannya dalam susunan asal. Pertama, kita pertimbangkan bagaimana untuk memindahkan No. 4 ke C? Kita perlu menggunakan B sebagai perantara, dan mula-mula memindahkan tiga di atas ke B. Operasi langkah ini ialah ① dalam program mula memanggil fungsi alih (panggilan pertama direkodkan sebagai satu, sudah tentu, n=4 sekarang, dan kemudian dinilai bahawa ③n!=1, jadi ④ bukan). dilaksanakan tetapi ⑤ dipanggil semula ( Ditandakan sebagai dua) Pertimbangkan cara memindahkan 3 cakera ke B. Ini adalah panggilan rekursif, jadi kita kembali ke ① sekali lagi dan mula memanggil fungsi alih, tetapi parameter yang sepadan telah berubah, kerana kali ini kita perlu mempertimbangkan untuk tidak memindahkan 4 cakera dari A ke C, tetapi bagaimana untuk bergerak dari A. Pindahkan 3 cakera ke B. Kerana n=3, ia tidak boleh digerakkan secara langsung dan memerlukan bantuan C sebagai perantara Pertama pertimbangkan kaedah mengalihkan dua ke C, jadi pergi ke ⑤ dan panggil fungsi gerakkan secara rekursif (ditandakan sebagai tiga) sekali lagi. Dengan cara yang sama, dua cakera masih tidak boleh dialihkan terus dari A ke C, jadi proses pemindahan 1 ke B mesti dipertimbangkan menggunakan B sebagai perantara. Kali ini ia menggunakan B sebagai perantara dan bergerak ke C sebagai tujuan. Seterusnya, panggil fungsi pindah secara rekursif (ditandakan sebagai empat) sekali lagi, yang bermaksud beralih ke B, yang boleh dilakukan secara langsung. Program melaksanakan ayat ③ dan ④ Program melompat keluar dari panggilan paling dalam (iaitu, melompat keluar dari panggilan keempat) dan kembali ke yang sebelumnya (kali ketiga), dan meneruskan ke bawah dari panggilan ketiga ke fungsi pindah. , iaitu, ⑧, iaitu, 2 Nombor berpindah ke C, dan kemudian diteruskan ke
⑩, dan kemudian alihkan cakera yang telah dialihkan ke B kembali ke C, sekali gus kembali ke rekursi kedua (masa apabila 3 cakera dialihkan ke B menggunakan C sebagai perantara). Jalankan ⑧, alihkan cakera ketiga dari A ke B, dan kemudian masukkan ⑩ Dalam panggilan ini, kerana dua cakera pada C dipindahkan ke B dengan A sebagai perantara, satu lagi panggilan rekursif diperlukan, sepadan dengan Pemindahan parameter mesti. dianalisis dengan jelas, siapa menara asal, siapa menara sasaran, dan siapa menara perantara. Proses ini serupa dengan analisis di atas dan tidak akan diulang di sini.
Atas ialah kandungan terperinci Bagaimana untuk menulis program bahasa C untuk menyelesaikan masalah Menara Hanoi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!