Tìm đường đi ngắn nhất giữa 2diểm trong 1 mê cung

20 2.3K 17
Tìm đường đi ngắn nhất giữa 2diểm trong 1 mê cung

Đ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

LỜI MỞ ĐẦU Trong khoa học máy tính, cấu trúc liệu cách lưu liệu máy tính cho sử dụng cách hiệu Thông thường, cấu trúc liệu chọn cẩn thận cho phép thực thuật toán hiệu Việc chọn cấu trúc liệu thường chọn cấu trúc liệu trừu tượng Một cấu trúc liệu thiết kế tốt cho phép thực nhiều phép toán, sử dụng tài nguyên, thời gian xử lý không gian nhớ tốt Các cấu trúc liệu triển khai cách sử dụng kiểu liệu, tham chiếu phép toán cung cấp ngôn ngữ lập trình Mỗi loại cấu trúc liệu phù hợp với vài loại ứng dụng khác nhau, số cấu trúc liệu dành cho công việc đặc biệt Để sâu nắm vững kiến thức thu nhận trình học môn Cấu Trúc Dữ Liệu, em chọn đề tài “Tìm đường ngắn diểm mê cung” để tìm hiểu nghiên cứu Do kiến thức hạn chế, dù cố gắng hoàn thiện thật tốt chắn đồ án nhiều thiếu sót Em mong có bảo, đóng góp ý kiến thầy bạn để chúng em hiểu rõ sâu sắc cấu trúc liệu giải thuật ứng dụng tin học Em xin chân thành cảm ơn! Sinh viên thực hiện: SVTH: Trang I GIỚI THIỆU VỀ ĐỀ TÀI: Nội dung đề tài : Trên bàn cờ ô vuông NxN ô đánh dấu ô tự do, ô đánh dấu ô có mìn Tìm đường ngắn điểm tự A, B cho trước “Mê cung” Tìm hiểu phân tích đề tài : a Truyền thuyết mê cung : Trong thần thoại Hi Lạp, có quỷ Minoto hang sâu Đường vào hang mê cung, có can đảm vào diệt quỷ không dễ lần vào hang quỷ mà bị lạc, không tìm lối Người anh hùng Teze liều vào hang quỷ Để giúp anh, nàng Arian đưa cho Têze cuộn nàng cầm đầu mối Khi vào mê lộ Têze kéo đần cuộn chỉ, đến lúc quay cần lại để lần theo mà khỏi mê cung Chuyện thần thoại vậy, mê cung hấp dẫn nhiều nhà kiến trúc, họa sĩ, thi sĩ hàng chục kỉ qua, Các nhà toán học ý đến mê cung mang nhiều ý nghĩa sâu sắc liên quan đến nhiều ngành toán học đại Ngay sống thường ngày, thường gặp mê cung toán đố vui :Tìm đường mê cung b Phân tích đề tài : Bài toán tìm đường hai điểm mê cung quy toán tìm đường hai điểm đồ thị Mê cung quy đổi ma trận 0, với quy định điểm điểm qua, điểm chướng ngại vật qua Có nhiều thuật toán đồ thị xây dựng để duyệt tất đỉnh đồ thị cho đỉnh viếng thăm lần Những thuật toán gọi thuật toán tìm kiếm đồ thị Đối với toán này,chúng ta sử dụng hai thuật toán tìm kiếm bản, duyệt theo chiều sâu DFS (Depth First Search) duyệt theo chiều rộng BFS (Breath First Search) SVTH: Trang c Tìm hiểu giải thuât giải toán : i)Thuật toán tìm kiếm theo chiều sâu (DFS) : Tư tưởng thuật toán tìm kiếm theo chiều sâu bắt đầu đỉnh v0 đó, chọn đỉnh u kề với v0 lấy làm đỉnh duyệt Cách duyệt thực tương tự đỉnh v0 với đỉnh bắt đầu u Để kiểm tra việc duyệt đỉnh lần, sử dụng mảng chuaxet[] gồm n phần tử (tương ứng với n đỉnh), đỉnh thứ i duyệt, phần tử tương ứng mảng chuaxet[] có giá trị FALSE Ngược lại, đỉnh chưa duyệt, phần tử tương ứng mảng có giá trị TRUE Thuật toán mô tả thủ tục đệ qui DFS () đó: chuaxet mảng giá trị logic thiết lập giá trị TRUE void DFS( int v){ Thăm_Đỉnh(v); chuaxet[v]:= FALSE; for ( u ∈ke(v) ) { if (chuaxet[u] ) DFS(u); } } Thủ tục DFS() thăm tất đỉnh thành phần liên thông với v đỉnh lần Để đảm bảo duyệt tất đỉnh đồ thị (có thể có nhiều thành phần liên thông), cần thực duyệt sau: { for (i=1; i≤ n ; i++) chuaxet[i]:= TRUE; /* thiết lập giá trị ban đầu cho mảng chuaxet[]*/ for (i=1; i≤ n ; i++) if (chuaxet[i] ) DFS( i); } *)Chú ý: Thuật toán tìm kiếm theo chiều sâu dễ dàng áp dụng cho đồ thị có hướng Đối với đồ thị vô hướng, cần thay cạnh vô hướng cung đồ thị có hướng SVTH: Trang Ví dụ: Áp dụng thuật toán tìm kiếm theo chiều sâu với đồ thị hình sau: Kết duyệt: 1, 2, 4, 3, 6, 7, 8, 10, 5, 9, 13, 11, 12 SVTH: Trang ii)Thuật toán tìm kiếm theo chiều rộng (BFS): Để ý rằng, với thuật toán tìm kiếm theo chiều sâu, đỉnh thăm muộn trở thành đỉnh sớm duyệt xong Đó kết tất yếu đỉnh thăm nạp vào stack thủ tục đệ qui Khác với thuật toán tìm kiếm theo chiều sâu, thuật toán tìm kiếm theo chiều rộng thay việc sử dụng stack hàng đợi queue Trong thủ tục này, đỉnh nạp vào hàng đợi v, đỉnh kề với v ( v1, v2, , vk) nạp vào queue Quá trình duyệt đỉnh có mặt hàng đợi Để ghi nhận trạng thái duyệt đỉnh đồ thị, ta sử dụng mảng chuaxet[] gồm n phần tử thiết lập giá trị ban đầu TRUE Nếu đỉnh i đồ thị duyệt, giá trị chuaxet[i] nhận giá trị FALSE Thuật toán dừng hàng đợi rỗng Thủ tục BFS thể trình thực thuật toán: void BFS(int u){ queue = φ; u [...]... số ô đã đi qua của đường đi tìm được Click vào Search để chương trình chỉ ra dường đi ngắn nhất giữa 2 ô đã nhập Click New để tìm đường đi giữa 2 ô khác Có thể chỉnh sửa lại mê cung bằng chức năng Edit Trên là đường đi ngắn nhất từ ô 1 đến ô 80 SVTH: Trang 18 V.KẾT LUẬN: 1. Kết quả đạt được Sau bảy tuần nghiên cứu và tìm hiểu đề tài, cùng với sự hướng dẫn tận tình của thầy cô và sự giúp đỡ của bạn... 2 c Tìm hiểu các giải thuât có thể giải quyết bài toán : .3 i)Thuật toán tìm kiếm theo chiều sâu (DFS) : 3 c THUẬT TOÁN TÌM KIẾM THEO CHIỀU SÂU (DFS) : 3 ii)Thuật toán tìm kiếm theo chiều rộng (BFS): 5 iii) So sánh giữa 2 phương pháp: 7 II.THUẬT TOÁN CƠ BẢN: .7 1. Xây dựng mê cung bằng ma trận kề: 7 2.Áp dụng thuật toán tìm kiếm... 7 II.THUẬT TOÁN CƠ BẢN: .7 1. Xây dựng mê cung bằng ma trận kề: 7 2.Áp dụng thuật toán tìm kiếm theo chiều sâu để tìm đường đi trong mê cung: 8 III.CHƯƠNG TRÌNH: .12 IV.KẾT QUẢ CHẠY CHƯƠNG TRÌNH : .17 V.KẾT LUẬN: 19 SVTH: Trang 20 ... tiep duoc hay ko if ((ok(a, b)) == 1 && (cx[a][b]) == 1) { try { if (matran[a][b] == 0) { c[a][b] = k; SVTH: Trang 15 cx[a][b] = 0; search(a, b, dem, cx); } } catch (Exception e) { System.out.println(e); } } } } } public Result parsexy(int a, int b) { //Chuyen thanh toa do cho diem bat dau inx = a / 10 ; iny = a - inx * 10 - 1; //New a la nhung so chia het cho 10 if (a % 10 == 0) { inx ; iny = 9; } //Chuyen... chuaxet); SVTH: Trang 16 rs = new Result(x, y, s, max); return rs; } //System.out.println(inx);System.out.println(iny);System.out.println(outx);System.o ut.println(outy); } } IV.KẾT QUẢ CHẠY CHƯƠNG TRÌNH : Giao diện chính của chương trình Các ô màu là ô có mìn, ô trắng là ô đi được From : nhập vị trí ô đầu SVTH: Trang 17 To: nhập vị trí ô cần đến All: tính tổng số ô đã đi qua của đường đi tìm được Click vào... structures and algorithms, 19 87 [4]Nguyễn Văn Linh, Trần Cao Đệ,Trương Thị Thanh Tuyền,Lâm Hoài Bảo, Phan Huy Cường,Trân Ngân Bình, Cấu Truc Dữ Liệu, 2003 SVTH: Trang 19 MỤC LỤC: LỜI MỞ ĐẦU 1 I.GIỚI THIỆU VỀ ĐỀ TÀI: 2 I.GIỚI THIỆU VỀ ĐỀ TÀI: 2 1. Nội dung đề tài : 2 2 .Tìm hiểu và phân tích đề tài : 2 a.Truyền thuyết về mê cung : .2 b.Phân... (a % 10 == 0) { inx ; iny = 9; } //Chuyen thanh toa do cho diem ket thuc outx = b / 10 ; outy = b - outx * 10 - 1; if (b % 10 == 0) { outx ; outy = 9; } if(matran[inx][iny]= =1) { JOptionPane.showMessageDialog(null, "First value is not valid You should choice again."); return new Result(); } else if(matran[outx][outy]= =1) { JOptionPane.showMessageDialog(null, "Second value is not valid You should choice... * SVTH: Trang 12 * @author linh */ public class TimDuongDi { private Result rs; private Thread t; private int m, n, i, j, d, s, max; private int[][] matran = new int[50][50]; private int inx, iny, outx, outy; private int[] x = new int[50]; private int[] y = new int[50]; private int[][] c = new int [10 0] [10 0]; private int[][] chuaxet = new int[50][50]; private int[] dx = {0, -1, 0, 0, 1} ; private int[]... private int[] dx = {0, -1, 0, 0, 1} ; private int[] dy = {0, 0, 1, -1, 0}; private int str[] = new int[200]; public TimDuongDi() { m = n = 10 ; try { FileInputStream f = new FileInputStream("out.txt"); int size, con, dem = 0; try { size = f.available(); for (i = 0; i < size; i++) { con = f.read(); if (con != 0 && con != 32 && con != 10 && con != 13 ) { str[dem] = con - 48; dem++; } } } catch (IOException... Logger.getLogger(TimDuongDi.class.getName()).log(Level.SEVERE, null, ex); } for (int i = 0; i < 10 ; i++) { for (int j = 0; j < 10 ; j++) { matran[i][j] = str[i * 10 + j]; SVTH: Trang 13 //System.out.print(matran[i][j]); } //System.out.println(); } this.chuanbi(); } //Khoi tao gia tri ban dau private void chuanbi() { for (i = 0; i < m; ++i) { for (j = 0; j < n; ++j) { c[i][j] = 0; chuaxet[i][j] = 1; } } c[0][0] = 0; d = 0; max = 200; } //Kiem tra ... x[0]=outx-1; y[0]=outy-1; SVTH: Trang 10 i=outx-1; j=outy-1; int k; // bien k chi da di theo huong nao luc dau while (c[i][j]! =-1 ) //tim theo thu tu nguoc { k=c[i][j]; i=i-dx[k]; j=j-dy[k]; s++;... i,int j) { if ((i==outx-1)&&(j==outy-1)) d=1; //ktra neu da den diem cuoi cung // dừng, d=1 la da tim thay dường else { SVTH: Trang int k; for (k=1;k

Ngày đăng: 05/01/2016, 09:38

Từ khóa liên quan

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

  • Đang cập nhật ...

Tài liệu liên quan