Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 21 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
21
Dung lượng
327 KB
Nội dung
TRƯỜNG ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG KHOA CÔNG NGHỆ THÔNG TIN ĐỒ ÁN CẤU TRÚC DỮ LIỆU VÀ THUẬT TOÁN Sinh viên thực hiện: Nguyễn Xuân Thạch : 07T3 Lê Trần Lam : 07T3 Nguyễn Văn Nam : 07T3 Lê Trung Dũng : 07T3 Giáo viên hướng dẫn: Phan Thanh Tao Đề tài: MÊ CUNG VÀ TÌM ĐƯỜNG ĐI TRONG MÊ CUNG Nội dung báo cáo • Phần 1 : Cơ sở lý thuyết • Phần 2 : Mô tả bài toán • Phần 3 : Thuật toán • Phần 4 : Chương trình • Phần 5 : Kết quả & đánh giá • Mê cung • Thuật toán Loang • Hàng đợi Phần 1: Cơ sở lý thuyết MÊ CUNG Là một hệ thống các con đường hoặc lòng hang động. Ô tường Ô có thể đi Ô bắt đầu, kết thúc Phần 1: Cơ sở lý thuyết THUẬ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ể đến Lặ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ơ sở lý thuyết HÀ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ơ sở lý thuyết • 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 Phần 2: Mô tả bài toán YÊU CẦU BÀI TOÁN Cho một mê cung và tìm đường đi trong mê cung đó. 1 0 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 1 1 0 0 0 1 1 0 1 1 1 1 1 0 0 0 1 0 0 0 1 1 1 0 1 0 0 1 1 0 1 1 0 0 1 1 0 1 1 0 1 1 1 0 1 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 1 1 0 0 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 1 1 0 0 0 1 1 0 1 1 1 1 1 0 0 0 1 0 0 0 1 1 1 0 1 0 0 1 1 0 1 1 0 0 1 1 0 1 1 0 1 1 1 0 1 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 1 1 0 0 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 1 Dữ liệu vào : mê cung ( biểu diễn bằng ma trận 2 chiều với giá trị 0, 1), đỉnh bắt đầu, đỉnh kết thúc. Dữ liệu ra : Đường đi giữa 2 đỉnh cho trước trong dữ liệu vào Phần 2: Mô tả bài toán GiẢ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; }DNODE; typedef struct tagDList { DNODE* pHead; DNODE* pTail; }QUEUE; Phần 2: Mô tả bài toán Giả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 Phần 2: Mô tả bài toán [...]... theo) Phần 5: Kết quả và đánh giá Mở file mê cung và ta có hình sau: Phần 5: Kết quả và đánh giá Click menu Best Path và chương trình sẽ vẽ đường đi Phần 5: Kết quả và đánh giá Click menu All Path, sau đó click menu View để xem các kết quả Phần 5: Kết quả và đánh giá 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 Nhưng do sử dụng cấu trúc hàng đợi nên đã giảm đáng kể số lần tìm kiếm... 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 } Phần 3: Thuật toán Tìm tất cả đường DNODE* 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 Bước 1: Nạp đỉnh vào Stack S Bước 2: Xét đỉnh đầu tiên ở S Nếu có đường. .. có đường đi từ đỉnh đó { Nạp tất cả đỉnh g đi được vào Sw; Đánh dấu tất cả g->father=S; 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: } Phần 3: Thuật toán Tìm tất cả đường Nếu như không thể đi được nữa (bị tắt đường) { Nếu như Sw = NULL thì kết thúc Nếu không { Xoá lùi các đỉnh trong S cho tới vị trí Sw->father;// nghĩa là tại đỉnh mà ở đó có ngã rẽ Nạp đỉnh đầu của Sw vào S; Xoá...Phần 3: Thuật toán • Tìm đường đi (ngắn nhất) • Tìm tất cả đường đi (có thể có) Phần 3: Thuật toán Tìm đường ngắn nhất Bước 1: Nạp đỉnh vào vào hàng đợi p=GetNode(xstart, ystart); EnQueue(maze,p); Bước 2 : While(maze.pHead != NULL)// Lặp trong khi hàng đợi chưa rỗng { p=DeQueue(maze)// Lấy 1 đỉnh từ hàng đợi để xét 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... các đỉnh kế tiếp Trường hợp xấu nhất thì bài toán sẽ vét cạn toàn bộ Tuy nhiên thuật toán này luôn luôn tìm ra lời giải Lời kết • 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 • Chúng em mong nhận được ý kiến đóng góp của các thầy cô và các bạn để hoàn thiện đồ án tốt hơn Cám ơn ! ... 3: Thuật toán Tìm tất cả đường Nế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úc Nế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: } } Phần 4: Chương trình • 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 . CUNG VÀ TÌM ĐƯỜNG ĐI TRONG MÊ CUNG Nội dung báo cáo • Phần 1 : Cơ sở lý thuyết • Phần 2 : Mô tả bài toán • Phần 3 : Thuật toán • Phần 4 : Chương trình • Phần 5 : Kết quả & đánh giá • Mê cung • Thuật. 1: Cơ sở lý thuyết • 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 Phần 2: Mô tả bài toán YÊU CẦU BÀI TOÁN Cho một mê cung và tìm đường đi trong mê cung đó. 1 0. trình nằm trong file nguồn kèm theo) Phần 4: Chương trình Mở file mê cung và ta có hình sau: Phần 5: Kết quả và đánh giá Click menu Best Path và chương trình sẽ vẽ đường đi Phần 5: Kết quả và