PDA

View Full Version : Thắc mắc bài toán tháp Hà Nội bằng hình ảnh



khoinguyen_lotus
08-05-2005, 18:01
Mình có một bài tập là : " Viết chương trình mô phỏng giải thuật tháp Hà Nội bằng hình ảnh viết bằng ngôn ngữ C++ hoặc visual C++"

Mình thật sự không biết biết cách nào để hoàn thành bài tập này, xin nhờ sự giúp đỡ của mọi người trên diễn đàn. Cảm ơn mọi người rất nhiều

NamBacvn
08-05-2005, 18:12
Lâu lắm rồi không nhớ nhưng hình như tên của thuật giải là đệ quy.
Yêu cầu: chuyển n đĩa từ cột 1 sang cột 2.
Giải: n=1 ok
Giả sử đã chuyển được n-1 đĩa từ một cột sang cột khác.
Thuật giải đệ quy:
Chuyển n đĩa từ cột 1 sang cột 2 bằng cách:
- chuyển n-1 đĩa từ cột 1 sang cột 3
- chuyển đĩa lớn nhất từ cột 1 sang cột 2
- chuyển n-1 đĩa từ cột 3 về cột 2
Thế là hoàn thành.

jiSh@n
09-05-2005, 01:21
Thuật giải thì ai mà chả biết, cái quan trọng là phải mô phỏng được bằng hình ảnh kìa. Theo mình nghĩ là ở mỗi bước chuyển dĩa bạn nên vẽ lại 3 cột với số dĩa hiện có của nó.

neverstop
09-05-2005, 01:24
trong cuốn sách của thầy Quách Tuấn Ngọc "Ngôn ngữ lập trình Pascal" có chương trình viết bằng Pascal mô phỏng lời giải bài toán này đấy (ở cuối sách). Bạn có thể chuyển chương trình này sang C++ không khó gì. Chương trình chạy dưới chế độ text.

thitkhohotvit
11-05-2005, 14:43
Tui có có source rất là trực quan nè, muốn lấy thì mail qua đây, trangabcd@yahoo.com

hieukenpro
03-02-2009, 09:31
#include<stdio.h>
void main()
{
void hanoi(int,int,int,int);
int nd;
printf("\n co bao nhiu dia=");
scanf("%d",&nd);
hanoi(nd,1,2,3);
}
void hanoi(int n,int xuat,int toi,int trung)
{
if(n>0)
{
hanoi(n-1,xuat,trung,toi);
printf("chuyen dich tu coc %d den coc %d",xuat,toi);
hanoi(n-1,trung,toi,xuat);
printf("\n");
}
return;
}

ptaminh
04-02-2009, 15:16
Bài của bạn bên trên cũng chỉ là xuất ra màn hình cho vui thôi chứ không có ứng dụng gì được cho bài này.

Vấn đề về thuật toán thì bạn chắc rõ rồi, ko cần bàn gì thêm.
Chỉ cần chỉnh lại tham số của hàm chuyển tháp để nó có tính ứng dụng cao như sau.

void hanoi(int n,int xuat,int toi,int trung,int CachChuyen[][2], int &SoBuocChuyen );
Mảng cách chuyển lưu lại toàn bộ các bước chuyển
bước chuyển CachChuyen[i] có 2 phần tử là CachChuyen[i][0] có giá trị cột có đĩa cần chuyển CachChuyen[i][1] là cột có được chuyển đĩa tới.

Còn về hình ảnh, nếu bạn làm trên môi trường C++ .NET thì có lớp graphics với đầy đủ các phương thức vẽ các đối tượng hình học, nếu dùng C++ trên window thì có thư viện vẽ hình GDI, hoặc GDI+ nhưng cái này bạn phải tự cài thêm, GDI thì có sẵn rồi.