Bài giảng Cấu trúc dữ liệu và giải thuật – Bài 4: Kỹ thuật quay lui (Backtracking)
lượt xem 13
download
"Bài giảng Cấu trúc dữ liệu và giải thuật – Bài 4: Kỹ thuật quay lui (Backtracking)" với những kiến thức khái niệm về kỹ thuật quay lui, bài toán 8 con hậu - eight queen problem, bài toán mã đi tuần - knight tour problem, bài toán chiếc ba lô - knapsack problem.
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Bài giảng Cấu trúc dữ liệu và giải thuật – Bài 4: Kỹ thuật quay lui (Backtracking)
- Cấu trúc dữ liệu và giải thuật Bài 4: Kỹ thuật quay lui (Backtracking) Lecturer: PhD. Ngo Huu Phuc Tel: 0438 326 077 Mob: 098 5696 580 Email: ngohuuphuc76@gmail.com 1 @Copyright PhD. Ngo Huu Phuc, Le Quy Don Technical University
- Bài 4. Kỹ thuật quay lui Backtracking Nội dung: 4.1. Khái niệm về kỹ thuật quay lui (6) 4.2. Bài toán 8 con hậu - Eight Queen Problem (7) 4.3. Bài toán mã đi tuần - Knight Tour Problem (5) 4.4. Bài toán chiếc ba lô - Knapsack Problem (6) Tham khảo: 1. Lecture 11 – Backtracking.htm 2 @Copyright PhD. Ngo Huu Phuc, Le Quy Don Technical University
- 4.1. Khái niệm kỹ thuật quay lui (1/6) Kỹ thuật quay lui là quá trình phân tích từ trên xuống trong không gian tìm kiếm. Trong trường hợp tổng quát, giả sử lời giải là một vector: a = (a[1], a[2], …, a[n]) trong đó, mỗi phần tử a[i] chọn từ tập hữu hạn S[i] (các khả năng của a[i]). 3 @Copyright PhD. Ngo Huu Phuc, Le Quy Don Technical University
- 4.1. Khái niệm kỹ thuật quay lui (2/6) Ta s ẽ giải quyết bài toán với kích thước k, có dạng: a = (a[1], a[2], …, a[k]) và cố gắng mở rộng bằng việc thêm phần tử tiếp theo vào trong vector. Sau khi thêm phần tử, kiểm tra xem có thể thực hiện tiếp được không. Nếu vẫn có khả năng mở rộng, tiếp tục thực hiện; Nếu không, xóa phần tử a[k] và làm lại bài toán từ tập S[k]. 4 @Copyright PhD. Ngo Huu Phuc, Le Quy Don Technical University
- 4.1. Khái niệm kỹ thuật quay lui (3/6) Gọi S[1], tập các khả năng của a tại bước đầu tiên. k=1 While k > 0 do While S[k][] do (*advance*) a[k] = an element in S[k] If (a[1], a[2],…, a[k]) is solution, print it! k=k+1 Tính S[k], tập khả năng của a tại bước k. k = k - 1 (*backtrack*) 5 @Copyright PhD. Ngo Huu Phuc, Le Quy Don Technical University
- 4.1. Khái niệm kỹ thuật quay lui (4/6) Sub Backtrack(a, k) If a is a solution, get it Else k = k +1 compute S[k] While S[k][] do a[k] = an element in S[k] S[k] = S[k] – a[k] Backtrack(a, k) End Sub 6 @Copyright PhD. Ngo Huu Phuc, Le Quy Don Technical University
- 4.1. Khái niệm kỹ thuật quay lui (5/6) Kỹ thuật đệ quy có thể được dùng trong kỹ thuật quay lui (đơn giản trong ứng dụng). Kỹ thuật quay lui chắc chắn đúng khi liệt kê các khả năng có thể. Để tăng hiệu quả của kỹ thuật, có thể cắt bớt không gian tìm kiếm. 7 @Copyright PhD. Ngo Huu Phuc, Le Quy Don Technical University
- 4.1. Khái niệm kỹ thuật quay lui (6/6) Trong phần này, giải quyết một số bài toán, có sử dụng kỹ thuật quay lui: Bài toán 8 hậu - Eight Queen Problem. Bài toán mã đi tuần - Knight Tour Problem. Bài toán chiếc ba lô - Knapsack Problem. 8 @Copyright PhD. Ngo Huu Phuc, Le Quy Don Technical University
- 4.2. Eight Queen Problem (1/7) Bài toán: đặt 8 con hậu trên bàn cờ sao cho không có 2 con hậu nằm trên cùng một hàng, cột và hàng ngang. Một lời giải Không phải lời giải 9 @Copyright PhD. Ngo Huu Phuc, Le Quy Don Technical University
- 4.2. Eight Queen Problem (2/7) Thực hiện: • Trạng thái: Sắp đặt từ 0 đến 8 con hậu lên bàn cờ. • Trạng thái khởi tạo: không có con hậu nào đặt lên bàn cờ. • Đặt từng con hậu lên bàn cờ. • Kiểm tra kết quả: 8 con hậu đã đặt lên bàn cờ, không có con hậu nào ăn được nhau. 648 cách đặt 8 con hậu 10 @Copyright PhD. Ngo Huu Phuc, Le Quy Don Technical University
- 4.2. Eight Queen Problem (3/7) Một vài cách đặt 8 con hậu lên bàn cờ (trong số 92 lời giải) 11 @Copyright PhD. Ngo Huu Phuc, Le Quy Don Technical University
- 4.2. Eight Queen Problem (4/7) Ý tưởng: Mỗi lần đệ quy, tìm cách đặt 1 con hậu lên một cột (hoặc hàng) riêng. Với mỗi lần gọi, tình trạng bàn cờ đã biết (các con hậu đã đặt) Nếu tại một cột, không đặt được con hậu mới, con hậu ở cột (hàng) đó được bỏ ra khỏi bàn cờ và chuyển xuống cột (hàng) trước đó. 12 @Copyright PhD. Ngo Huu Phuc, Le Quy Don Technical University
- 4.2. Eight Queen Problem (5/7) Nếu xét theo cột, tại một cột, tất cả các hàng đã xét, quay trở lại bước trước đó (xét cột trước). Nếu con hậu không đặt được lên cột i, khi đó không thử trên cột i+1, quay lại cột i-1, bỏ con hậu đã đi sai. Với cách tiếp cận này, có thể giảm bớt phép thử. 13 @Copyright PhD. Ngo Huu Phuc, Le Quy Don Technical University
- 4.2. Eight Queen Problem (6/7) #include "stdio.h" // In ma tran chua cac con hau #include "conio.h" void printMatrix(int a[][N], int n) { #include "math.h" int i, j; #define N 8 for(i=0; i
- 4.2. Eight Queen Problem (6/7) // Kiem tra xem con hau tiep theo co the dat o hang // Bai toan N hau // row, cot col khong void N_Queens(int a[][N], int n, int row) { bools feasible(int a[][N], int n, int row, int col) int j; { if(row < n) { int i; for(j=0; j
- 4.3. Knight Tour Problem (1/5) 16 @Copyright PhD. Ngo Huu Phuc, Le Quy Don Technical University
- 4.3. Knight Tour Problem (2/5) Bài toán: Trên bàn cờ 8 × 8 có một con mã (cách đi được định nghĩa thông thường). Bắt đầu từ một góc của bàn cờ và thăm tất cả các ô cờ khác (63 ô cờ còn lại), sao cho mỗi ô cờ chỉ đến 1 lần. Bài toán này được gọi là “mã đi tuần”. 17 @Copyright PhD. Ngo Huu Phuc, Le Quy Don Technical University
- 4.3. Knight Tour Problem (3/5) Cách tiếp cận bài toán: Có nhiều cách tiếp cận để giải bài toán này. Một trong số đó là cách giải của J.C. Warnsdorff được đưa ra năm 1823. Theo cách của J.C. Warnsdorff, con mã đi theo theo thứ tự được mã hóa (quy ước cách đi theo hình vẽ). Từ một vị trí, con mã có thể đi tối đa đến 8 vị trí khác. Tùy theo vị trí trên bàn cờ, các vị trí có thể này được mã hóa theo thứ tự từ 1 đến 8. 18 @Copyright PhD. Ngo Huu Phuc, Le Quy Don Technical University
- 4.3. Knight Tour Problem (4/5) #include "stdio.h" for(m=0;m
- 4.3. Knight Tour Problem (5/5) void knight(int a[][M], int n, int row, int col, int num) printf("\nNhan Enter de chon ket qua khac, nhan { ESC de thoat!\n"); // tim vi tri ke tiep if(char c=getch()==27) // vi tri ke tiep co gia nho nhat exit(1); // vi tri hien tai la (row,col) } int i; else for(i=0; i=0 && newrow=0 && newcol
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài giảng Cấu trúc dữ liệu - Bài 1:Tổng quan về cấu trúc dữ liệu và giải thuật
47 p | 174 | 17
-
Bài giảng Cấu trúc dữ liệu 1: Chương 1 - Lương Trần Hy Hiến
7 p | 162 | 9
-
Bài giảng Cấu trúc dữ liệu và giải thuật trong C++ - Bài 8: Cấu trúc dữ liệu ngăn xếp
28 p | 77 | 9
-
Bài giảng Cấu trúc dữ liệu giải thuật: Các kiểu dữ liệu trừu tượng cơ bản - Cấu trúc dữ liệu tuyến tính
92 p | 116 | 9
-
Bài giảng Cấu trúc dữ liệu và giải thuật – Bài 17: Cấu trúc dữ liệu dạng cây
21 p | 77 | 8
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Các cấu trúc dữ liệu
193 p | 57 | 7
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 1 - Trần Minh Thái (Trường Đại học Hồng Bàng )
62 p | 158 | 6
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Cấu trúc dữ liệu cây AA - Bùi Tiến Lên
30 p | 35 | 6
-
Bài giảng Cấu trúc dữ liệu - Chương 3: Cấu trúc cây
65 p | 58 | 6
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 1 - Trần Minh Thái (2016)
62 p | 94 | 6
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Cấu trúc dữ liệu mảng với danh sách liên kết - Bùi Tiến Lên
36 p | 41 | 5
-
Bài giảng Cấu trúc dữ liệu: Chương 1 - ThS. Thiều Quang Trung (2018)
44 p | 43 | 4
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 1 – Trần Minh Thái (2017)
67 p | 105 | 4
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 7 - Châu Thị Bảo Hà
133 p | 113 | 4
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Cấu trúc dữ liệu cây AVL - Bùi Tiến Lên
38 p | 46 | 4
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 5 - Ngô Quang Thạch
24 p | 58 | 3
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 2 - Th.S Thiều Quang Trung
41 p | 68 | 3
-
Bài giảng Cấu trúc dữ liệu giải thuật: Cấu trúc dữ liệu
17 p | 50 | 2
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn