Đồ Án Mê cung và đường đi

20 3K 18
Đồ Án Mê cung và đường đi

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Đồ án Cấu Trúc Dữ Liệu – Nhóm 12A GVHD: Phan Thanh Tao Mở đầu ấu trúc dữ liệu là môn học quan trọng mấu chốt trong chuyên ngành Công nghệ thông tin. Nó là cơ sơ để chúng ta giải quyết một số bài toán đồng thời cung cấp những hiểu biết về cách tổ chức dữ liệu nhằm giải quyết các bài toán hiệu quả nhất. C Đề tài của nhóm là : mê cung và đường đi. Nội dung báo cáo chia ra 5 phần 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á Nhóm đã cố gắng hết sức để hoàn chỉnh đồ án, song chắc chắn không tránh khỏi thiếu sót, vì vậy kính mong nhận được góp ý và hướng dẫn của thầy cô cùng các bạn. Nhân dịp này, nhóm xin chân thành cám ơn các giảng viên khoa Công Nghệ Thông Tin và đặc biệt là thầy Phan Thanh Tao đã hướng dẫn, giúp đỡ nhóm hoàn thành Đồ án này. Nhóm báo cáo : C15 Nguyễn Xuân Thạch : 07T3 Lê Trần Lam : 07T3 Nguyễn Văn Nam : 07T3 Lê Trung Dũng : 07T3 Đà Nẵng 27-11-2009 Mục lục Nhóm báo cáo : C15 - Số đề tài : 14  Page 1 Đồ án Cấu Trúc Dữ Liệu – Nhóm 12A GVHD: Phan Thanh Tao PHẦN 1: CÁC CƠ SỞ LÝ THUYẾT 3    PHẦN 2: MÔ TẢ BÀI TOÁN 5   !"#" $%&'( PHẦN 3: THUẬT TOÁN 7 )&!*+,-. )&/!*0 PHẦN 4: CHƯƠNG TRÌNH 9 PHẦN 5: KẾT QUẢ & ĐÁNH GIÁ 17 1!2#345#6!789. :9; Giới thiệu đề tài Đề tài : Cho một mê cung (maze) và tìm đường đi trong mê cung Nhóm báo cáo : C15 - Số đề tài : 14  Page 2 Đồ án Cấu Trúc Dữ Liệu – Nhóm 12A GVHD: Phan Thanh Tao PHẦN 1: CÁC CƠ SỞ LÝ THUYẾT Mê cung: Là một hệ thống các con đường hoặc lòng hang động. Được xây dựng nên bởi các hàng rào được bố trí theo quy luật nào đó. Các thành phần của mê cung: Ô tường Ô có thể đi Ô bắt đầu, kết thúc Tính chất: có duy nhất 1 lối vào và 1 lối ra. Đường đi từ lối vào đến lối ra rất phức tạp. Ứng dụng : Xây dựng các mật đạo, các mê cung giải trí trong công viên, trò chơi điện tử. Thuật toán Loang : Là thuật toán duyệt theo chiều rộng để tìm ra kết quả mà chúng ta mong muốn, tư tưởng của thuật toán rất đơn giản : khi cho 1 bài toán chúng ta sẽ được cung cấp 1 số dữ kiện ban đầu và phải đưa ra kết quả mà bài yêu cầu(có thể có hoặc không), phương pháp này đưa ra với mục đích duyệt mọi khả năng có thể có của bài toán và nếu trong các khả năng đó có cấu hình mong muốn thì chúng ta coi như tìm được đáp án và ngược lại là không có kết quả (no solution). Nhóm báo cáo : C15 - Số đề tài : 14  Page 3 Đồ án Cấu Trúc Dữ Liệu – Nhóm 12A GVHD: Phan Thanh Tao Để giải quyết dễ dàng người ta mô hình hóa bài toán về mô hình 1 đồ thị để làm việc Giả sử dữ liệu ban đầu là gốc (root) của cây thì các khả năng sẽ là các lá, và trình tự giải bài toán sẽ là đường đi từ root đến lá (nếu lá đó là cấu hình mong muốn). quá trình Loang là quá trình kiểm tra tất cả các đường đi từ gốc đến tất cả các lá nếu tìm được đường đi đưa ra đáp án mà bài yêu cầu thì bài toán coi như giải xong. Cấu trúc hàng đợi: Hàng đợi (tiếng Anh: queue) 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 (viết tắc từ tiếng Anh: First In First Out), nghĩa là việc thêm vào hoặc lấy một đối tượng ra khỏi hàng đợi, được thực hiện theo cơ chế "vào trước ra trước". Trong hàng đợi, các đối tượng có thể được thêm vào hàng đợi bất kỳ lúc nào, nhưng chỉ có đối tượng thêm vào đầu tiên mới được phép lấy ra khỏi hàng đợi. Thao tác thêm vào và lấy một đối tượng ra khỏi hàng đợi được gọi lần lượt là "enqueue" và "dequeue". Việc thêm một đối tượng luôn diễn ra ở cuối hàng đợi và một phần tử luôn được lấy ra từ đầu hàng đợi. Nhóm báo cáo : C15 - Số đề tài : 14  Page 4 Đồ án Cấu Trúc Dữ Liệu – Nhóm 12A GVHD: Phan Thanh Tao Cấu trúc dữ liệu hàng đợi có thể định nghĩa như sau: Hàng đợi là một cấu trúc dữ liệu tương tự như ngăn xếp, hàng đợi hỗ trợ các thao tác:  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ó. Nếu hàng đợi rỗng thì lỗi sẽ xảy ra. Các thao tác thêm, trích và huỷ một phần tử phải được thực hiện ở hai phía khác nhau của hàng đợi, do đó hoạt động của hàng đợi được thực hiện theo cơ chế FIFO. Cũng như ngăn xếp, cấu trúc mảng một chiều hoặc cấu trúc danh sách liên kết có thể dùng để biểu diễn cấu trúc hàng đợi. Khi mô hình bài toán về đồ thị để làm việc thì việc quan trọng hàng đầu là phải xác định được cấu trúc (struct) của định và quan hệ giữa các đỉnh. khi xác định xong thì chúng ta tiến hành Loang bình thường, khi đó cấu trúc phần tử (element) của Queue chính là cấu trúc của đỉnh. Trong tin học, cấu trúc dữ liệu hàng đợi có nhiều ứng dụng: khử đệ qui, tổ chức lưu vết các quá trình tìm kiếm theo chiều rộng và quay lui, vét cạn, tổ chức quản lý và phân phối tiến trình trong các hệ điều hành, PHẦN 2: MÔ TẢ BÀI TOÁN Yêu cầu bài toán: Với một mê cung cho trước, hãy tìm đường đi trong mê cung. Ta cụ thể bài toán như sau: Biểu diễn mê cung bằng ma trận 2 chiều với các giá trị 1 là tường , 0 là đường đi. Ta nhập vào ma trận và xuất ra đường đi tương ứng với ma trận mê cung đó. 1. Thông tin vào : a. Ma trận mê cung b. Toạ độ vào, toạ độ ra c. Hình minh hoạ Nhóm báo cáo : C15 - Số đề tài : 14  Page 5 Đồ án Cấu Trúc Dữ Liệu – Nhóm 12A GVHD: Phan Thanh Tao 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 2. Thông tin ra a. Đường ngắn nhất để thoát khỏi mê cung b. Tất cả các đường có thể thoát khỏi mê cung c. Hình minh hoạ Cấu trúc lưu trữ dữ liệu và các hàm chính: Để giải quyết bài toán đã cho, ta dùng cấu trúc hàng đợi. Cấu trúc được mô tả bằng đoạn mã sau( trong ngôn ngữ C++) : typedef struct tagDNode { int x; int y; struct tagDNode* next; struct tagDNode* father; }DNODE; • x,y là toạ độ hiện hành • next là con trỏ trỏ đến phần từ ngay sau nó • father là con trỏ trỏ đến phần tử đã dẫn tới nó Hình minh hoạ Nhóm báo cáo : C15 - Số đề tài : 14  Page 6 Đồ án Cấu Trúc Dữ Liệu – Nhóm 12A GVHD: Phan Thanh Tao typedef struct tagDList { DNODE* pHead; DNODE* pTail; }QUEUE; Hinh minh hoạ Các nguyên mẫu hàm và công dụng của nó  DNODE* GetNode(int u,int v); //khởi tạo 1 phần tử kiểu tagDNode và giá trị trả về là con //trỏ kiểu DNODE để quản lý nó  void EnQueue(QUEUE &l,DNODE* newe); //Thêm 1 phần tử newe vào hàng đợi l  DNODE* DeQueue(QUEUE &l); //Lấy 1 phần tử ra khỏi hàng đợi ( theo cơ chế vào trước /ra trước ) PHẦN 3: THUẬT TOÁN Thuật toán tìm đường đi (ngắn nhất): QUEUE maze; DNODE* p, g; 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 Nhóm báo cáo : C15 - Số đề tài : 14  Page 7 Đồ án Cấu Trúc Dữ Liệu – Nhóm 12A GVHD: Phan Thanh Tao - Kiểm tra đỉnh đó là đỉnh ra ? o Nếu đúng :In kết quả, kết thúc thuật toán o Nếu sai :  Kiểm tra các hướng có thể đi từ đỉnh đó ? ( cụ thể là trái phải trên dưới) • Nếu đi được : o g=GetNode(xnew,ynew); o EnQueue(maze,g);// Nạp đỉnh mới vào hàng đợi o g->father=p;// Đánh dấu đỉnh dẫn tới g } Nếu kết thúc vòng lặp mà vẫn chưa có kết quả thì thông báo vô nghiệm. Thuật toán tìm tất cả các đường đi: 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 vào stack S Bước 2: Xét đỉnh đầu tiên ở S - Nếu 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: } - 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á đỉnh đầu của Sw; Lặp lại bước 2: Nhóm báo cáo : C15 - Số đề tài : 14  Page 8 Đồ án Cấu Trúc Dữ Liệu – Nhóm 12A GVHD: Phan Thanh Tao } } - 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 Vì chương trình được viết bằng ngôn ngữ Visual C++ bao gồm nhiều thư viện tạo form, dialog nên chúng ta chỉ trình bày đoạn chương trình C++ trong môi trường Borland C. #include<stdio.h> #include<conio.h> #include<stdlib.h> int MAZE[20][20]; // mang luu ma tran chinh int MAZE2[20][20]; // mang luu ma tran phu int hang,cot,xstart,ystart,xgoal,ygoal; int leftDraw, topDraw; // toa do bat dau ve me cung int coutWay; typedef struct tagDNode { int x; int y; struct tagDNode* next; struct tagDNode* father; }DNODE; typedef struct tagDList//tagDList la cau truc gom 2 con tro DNODE //con tro DNODE co cau truc tagDNode { Nhóm báo cáo : C15 - Số đề tài : 14  Page 9 Đồ án Cấu Trúc Dữ Liệu – Nhóm 12A GVHD: Phan Thanh Tao DNODE* pHead; DNODE* pTail; }QUEUE; DNODE* GetNode(int u,int v)//Ham khoi tao,kieu tra ve la con tro DNODE tro den //1 phan tu tagDNode[DNODE] { DNODE *p;//p la con tro tro den DNODE p=new DNODE; if(p==NULL) { printf("Het bo nho"); exit(1); } //Gan thong tin cho p; p->x=u; p->y=v; p->next=NULL; p->father=NULL; return p; } void AddFirst(QUEUE &l,DNODE* new_ele)//new_ele la con tro { if(l.pHead==NULL)//Xau rong { l.pHead=new_ele; l.pTail=l.pHead; } else { new_ele->next=l.pHead; l.pHead=new_ele; } } void AddLast(QUEUE &l,DNODE* newe)//Right!! { if(l.pHead==NULL)//xau rong~ { l.pHead=newe; Nhóm báo cáo : C15 - Số đề tài : 14  Page 10 [...]... & ĐÁNH GIÁ Hướng dẫn sử dụng chương trình Giống như các chương trình phổ biến trên window, ta click vào file exe chương trình có giao diện đơn giản như sau: Nhóm báo cáo : C15 - Số đề tài : 14  Page 17 Đồ án Cấu Trúc Dữ Liệu – Nhóm 12A GVHD: Phan Thanh Tao Mở file dữ liệu mê cung có sẵn và ta được mê cung vẽ bằng các ô vuông như sau với tường là màu đỏ, vàng là đường đi và màu xanh là đỉnh vào và. .. Best Path, chương trình sẽ vẽ ra đường đi ngắn nhất và liệt kê số bước đi Nhóm báo cáo : C15 - Số đề tài : 14  Page 18 Đồ án Cấu Trúc Dữ Liệu – Nhóm 12A GVHD: Phan Thanh Tao Sau khi Click vào menu All Path, sẽ có hộp thoại nhắc ta Click vào menu View (hoặc phím Enter) để xem lần lượt các đường đi Đánh giá Vì dùng thuật toán tìm kiếm theo chiều rộng cho nên 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 (nghĩa là đỉnh ra gần đỉnh vào) 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 giải vô ích so với cách dùng tập hợp lưu các đỉnh kế tiếp Nhóm báo cáo : C15 - Số đề tài : 14  Page 19 Đồ án Cấu Trúc Dữ Liệu – Nhóm 12A GVHD: Phan Thanh Tao 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 Tài liệu tham... x=S->x;y=S->y;//printf("\n%d:%d",x,y); if(x==duoix&&y==duoiy)//Neu ve dich { Nhóm báo cáo : C15 - Số đề tài : 14  Page 13 Đồ án Cấu Trúc Dữ Liệu – Nhóm 12A GVHD: Phan Thanh Tao DisplayStack(S);//WriteFile(S); demA=0; if(Sw==NULL) break; //Thuat toan se dung khi ko con ptu trong else{ //"Stack Wait" ,cung co nghia la het //duong roi SetFree(S,Sw->father);//neu chua het duog, tiep tuc Add //"Stack wait" g=Sw;DelSw(Sw);... beAdd=1; } if(check(x+1,y)==1) { p=GetNode(x+1,y);p->father=S;AddSw(Sw,p); beAdd=1; } if(beAdd==1) //Neu nhu tai dinh hien tai co duog di,thi ta //add Nhóm báo cáo : C15 - Số đề tài : 14  Page 14 Đồ án Cấu Trúc Dữ Liệu – Nhóm 12A { GVHD: Phan Thanh Tao //Stack wait -> Stack Way g=Sw;DelSw(Sw); AddS(S,g); } else //Neu beAdd==0 nghia la tat duong,thi xoa lui cac //duong di { //xoa den dinh ma noi... f=fopen("maze1.txt","r"); fscanf(f,"%d",&hang); fscanf(f,"%d",&cot); fscanf(f,"%d",&xstart); fscanf(f,"%d",&ystart); fscanf(f,"%d",&xgoal); fscanf(f,"%d",&ygoal); Nhóm báo cáo : C15 - Số đề tài : 14  Page 15 Đồ án Cấu Trúc Dữ Liệu – Nhóm 12A GVHD: Phan Thanh Tao for(int i=0;ix,p->y); p=p->next; } fprintf(fp,"\n\n"); } void DisplayStack(DNODE* l)//Right!! { DNODE* p; p=l; printf("\n");... if(l==vitri) return; p=l; l=l->next; x=p->x;y=p->y;MAZE2[x][y]=0; delete p; } } } void AddS(DNODE* &l,DNODE* new_ele)//Right!!! { int x,y; new_ele->next=l; Nhóm báo cáo : C15 - Số đề tài : 14  Page 12 Đồ án Cấu Trúc Dữ Liệu – Nhóm 12A GVHD: Phan Thanh Tao l=new_ele; x=new_ele->x;y=new_ele->y; MAZE2[x][y]=100;//chu y khi add vao "duong di" thi khong cho di wa nua,dah dau 100 } void AddSw(DNODE* &l,DNODE*.. .Đồ án Cấu Trúc Dữ Liệu – Nhóm 12A GVHD: Phan Thanh Tao l.pTail=l.pHead; } else { l.pTail->next=newe; l.pTail=newe; } } DNODE* RemoveFirst(QUEUE &l)//lay ra phan tu dau tien,ko xoa ! { DNODE *p; p=NULL; . bài toán như sau: Biểu diễn mê cung bằng ma trận 2 chiều với các giá trị 1 là tường , 0 là đường đi. Ta nhập vào ma trận và xuất ra đường đi tương ứng với ma trận mê cung đó. 1. Thông tin vào : a rộng và quay lui, vét cạn, tổ chức quản lý và phân phối tiến trình trong các hệ đi u hành, PHẦN 2: MÔ TẢ BÀI TOÁN Yêu cầu bài toán: Với một mê cung cho trước, hãy tìm đường đi trong mê cung. . Cho một mê cung (maze) và tìm đường đi trong mê cung Nhóm báo cáo : C15 - Số đề tài : 14  Page 2 Đồ án Cấu Trúc Dữ Liệu – Nhóm 12A GVHD: Phan Thanh Tao PHẦN 1: CÁC CƠ SỞ LÝ THUYẾT Mê cung: Là

Ngày đăng: 10/04/2015, 16:26

Từ khóa liên quan

Mục lục

  • PHẦN 1: CÁC CƠ SỞ LÝ THUYẾT

    • Mê cung:

    • Thuật toán Loang :

    • Cấu trúc hàng đợi:

    • PHẦN 2: MÔ TẢ BÀI TOÁN

      • Yêu cầu bài toán:

      • Cấu trúc lưu trữ dữ liệu và các hàm chính:

      • PHẦN 3: THUẬT TOÁN

        • Thuật toán tìm đường đi (ngắn nhất):

        • Thuật toán tìm tất cả các đường đi:

        • PHẦN 4: CHƯƠNG TRÌNH

        • PHẦN 5: KẾT QUẢ & ĐÁNH GIÁ

          • Hướng dẫn sử dụng chương trình

          • Đánh giá

Tài liệu cùng người dùng

Tài liệu liên quan