TRƯỜNG ĐẠI HỌC BÁCH KHOA ĐÀ NẴNGKHOA CÔNG NGHỆ THÔNG TIN CẤU TRÚC DỮ LIỆU VÀ THUẬT TOÁN Sinh viên thực hiện: Giáo viên hướng dẫn: Phan Thanh Tao Đề tài: MÊ CUNG VÀ TÌM ĐƯỜNG ĐI TRONG MÊ
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA CÔNG NGHỆ THÔNG TIN
CẤU TRÚC DỮ LIỆU VÀ THUẬT TOÁN
Sinh viên thực hiện:
Giáo viên hướng dẫn: Phan Thanh Tao
Đề tài: MÊ CUNG VÀ TÌM ĐƯỜNG ĐI TRONG MÊ CUNG
Trang 2N i dung báo cáo ội dung báo cáo
Trang 3• Mê cung
• Thuật toán Loang
• Hàng đợi
Ph n 1: C ần 1: C ơ s lý thuy t ở lý thuyết ết
Trang 5THUẬT TOÁN LOANG
Là thuật toán duyệt theo chiều rộng
Duyệt mọi khả năng có thể có của bài toán
Mô hình hoá thuật toán Loang
Từ đỉnh hiện tại, duyệt qua tất cả đỉnh
có thể đếnLặp lại quá trình đó đến khi gặp cấu hình mong muốn, ngược lại bài toán không có kết quả
Ph n 1: C ần 1: C ơ s lý thuy t ở lý thuyết ết
Trang 6HÀNG ĐỢI
Là một cấu trúc dữ liệu dùng để chứa các đối tượng làm việc theo cơ chế FIFO
Hai thao tác quan trọng trong cấu trúc hàng đợi là :
EnQueue(o): thêm đối tượng o vào cuối hàng đợi.
DeQueue(): lấy đối tượng ở đầu queue ra khỏi hàng đợi và trả về giá trị của nó
Ứng dụng hàng đợi: khử đệ quy, quản lý các tiến trình,
tìm kiếm theo chiều rộng, quay lui, vét cạn…
Ph n 1: C ần 1: C ơ s lý thuy t ở lý thuyết ết
Trang 7• Yêu cầu bài toán
• Giải quyết bài toán
– Cấu trúc dữ liệu – Các hàm, thủ tục
Trang 8YÊU CẦU BÀI TOÁN
Cho một mê cung và tìm đường đi trong mê cung đó.
Trang 9GiẢI QUYẾT BÀI TOÁN
Ngôn ngữ sử dụng : C++
Cấu trúc dữ liệu : Hàng đợi
typedef struct tagDNode
{
int x;
int y;
struct tagDNode* next;
struct tagDNode* father;
Trang 10Giải quyết bài toán
– Các hàm, thủ tục
• DNODE* GetNode(int u,int v); //khởi tạo 1 node
• void EnQueue(QUEUE &l,DNODE* newe); //Thêm 1 node (newe)
vào hàng đợi
• DNODE* DeQueue(QUEUE &l); //Lấy ra 1 node ra khỏi hàng đợi
Trang 11• Tìm đường đi (ngắn nhất)
• Tìm tất cả đường đi (có thể có)
Trang 12While(maze.pHead != NULL)// Lặp trong khi hàng đợi chưa rỗng
Kiểm tra đỉnh đó là đỉnh ra ? Nếu đúng :In kết quả, kết thúc thuật toán Nếu sai :
Kiểm tra các hướng có thể đi từ đỉnh đó ? Nếu đi được :
g=GetNode(xnew,ynew);
EnQueue(maze,g);// Nạp đỉnh mới vào hàng đợi
g->father=p;// Đánh dấu đỉnh dẫn tới g
}
Trang 13DNODE* S, Sw; //S là stack chứa các phần tử chứa đỉnh tạo thành đường đi
//Sw là stack chứa các đỉnh tạm thời
//S là stack chứa các đỉnh tạo thành đường đi
Nạp đỉnh đầu của Sw vào S;
Xoá đỉnh đầu tiên của Sw;
Lặp lại bước 2:
}
Bước 1:
Nạp đỉnh vào Stack S
Trang 14Nếu như không thể đi được nữa (bị tắt đường)
Nạp đỉnh đầu của Sw vào S;
Xoá đỉnh đầu của Sw;
Lặp lại bước 2:
}}
Trang 15Nếu đỉnh hiện tại là đỉnh ra
{
Xuất kết quả (nghĩa là xuất các đỉnh trong S);
Nếu Sw = NULL thì kết thúcNếu không
{
Xoá lùi trong S tới vị trí Sw->father;
Nạp đỉnh đầu của Sw vào S;
Xoá đỉnh đầu của Sw;
Lặp lại bước 2:
}}
Trang 16• Chương trình được viết trong môi trường MFC (Visual C++)
• Kết quả được thể hiện dưới dạng đồ hoạ
(Toàn bộ chương trình nằm trong file nguồn kèm theo)
Trang 17Mở file mê cung và ta có hình sau:
Trang 18Click menu Best Path và chương trình sẽ vẽ đường đi
Trang 19Click menu All Path, sau đó click menu View để xem các kết quả
Trang 20 Bài toán hiệu quả khi lời giải nằm gần gốc của cây tìm kiếm
kể số lần tìm kiếm giải vô ích so với cách dùng tập hợp lưu các đỉnh kế tiếp
Tuy nhiên thuật toán này luôn luôn tìm ra lời giải.
Trang 21• Nhóm xin phép được kết thúc phần trình bày của mình ở đây.
• Trong quá trình thực hiện đồ án không tránh khỏi những khó khăn, thiếu sót.
Cám ơn !
L i ờng k t ết