Nguyễn Duy Khánh Linh – 20204839 TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI BÁO CÁO KỸ THUẬT LẬP TRÌNH Thực hành sử dụng các cấu dữ liệu cơ bản để giải quyết các bài toán cụ thể BUỔI 4 – TUẦN 41 NGUYỄN DUY KHÁNH[.]
Nguyễn Duy Khánh Linh – 20204839 TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI BÁO CÁO KỸ THUẬT LẬP TRÌNH Thực hành sử dụng cấu liệu để giải toán cụ thể BUỔI – TUẦN 41 NGUYỄN DUY KHÁNH LINH Linh.ndk204839@sis.hust.edu.vn Ngành Kỹ Thuật Lập Trình – IT2 Giảng viên hướng dẫn: Lê Thị Hoa Bộ mơn: Kỹ thuật lập trình Viện: Cơng nghệ Thông tin Truyền thông IT3040 – 20212 – 715027 HÀ NỘI, 04/07/2022 Chữ ký GVHD Nguyễn Duy Khánh Linh – 20204839 MỤC LỤC Bài thực hành – tuần 41: Thực hành sử dụng cấu trúc liệu để giải toán cụ thể Phần Bài tập thực hành .4 Bài tập 1: Đảo ngược danh sách liên kết đơn Hãy hoàn thiện hàm thao tác danh sách liên kết: Thêm phần tử vào đầu danh sách liên kết; In danh sách; Đảo ngược danh sách liên kết (yêu cầu độ phức tạp thời gian O(N) chi phí nhớ dùng thêm O(1)) Bài tập 2: Tính diện tích tam giác Một điểm không gian chiều biểu diễn pair Hãy viết hàm double area(Point a, Point b, Point c) tính diện tích tam giác theo tọa độ đỉnh Trong đó, Point kiểu định nghĩa sẵn trình chấm sau: using Point = pair; Bài tập 3: Tính tích có hướng vector Một vector không gian chiều biểu diễn tuple Hãy viết hàm Vector cross_product(Vector a, Vector b) tính tích có hướng vector Trong Vector kiểu liệu định nghĩa sẵn trình chấm sau: using Vector = tuple; .7 Bài tập 4: Thao tác với vector Cho hai vector, xóa hết phần tử chẵn, xếp giảm dần số vector trộn lại thành vector xếp giảm dần Bài tập 5: .11 Viết hàm thực thuật tốn DFS khơng sử dụng đệ quy đồ thị biểu diễn danh sách kề vector< list > Đồ thị có n đỉnh đánh số từ đến n Thuật toán DFS xuất phát từ đỉnh Các đỉnh thăm theo thứ tự ưu tiên từ trái sang phải danh sách kề Yêu cầu hàm trả thứ tự đỉnh thăm (những đỉnh thăm từ đỉnh khơng phải in ra) 11 Bài tập 6: .13 Viết hàm thực thuật tốn BFS khơng sử dụng đệ quy đồ thị biểu diễn danh sách kề vector< list > Đồ thị có n đỉnh đánh số từ đến n Thuật toán BFS xuất phát từ đỉnh Các đỉnh thăm theo thứ tự ưu tiên từ trái sang phải danh sách kề Yêu cầu hàm trả thứ tự đỉnh thăm (những đỉnh thăm từ đỉnh khơng phải in ra) 13 Bài tập 7: .15 Viết hàm thực phép giao hợp hai tập hợp biểu diễn set 15 Bài tập 8: .16 Viết hàm thực phép giao hợp hai tập hợp mờ biểu diễn map Trong phần tử gán cho số thực đoạn [0 1] biểu thị độ thuộc phần tử tập hợp, với độ thuộc nghĩa phần tử chắn thuộc vào tập hợp ngược lại độ thuộc nghĩa phần tử chắn không thuộc tập hợp Phép giao hợp tập hợp IT3040 – 20212 – 715027 Nguyễn Duy Khánh Linh – 20204839 thực cặp phần tử tập hợp, với độ thuộc tính phép tốn max hai độ thuộc 16 Bài tập 9: .19 Cài đặt thuật toán Dijkstra đồ thị vô hướng biểu diễn danh sách kề sử dụng priority_queue Cụ thể, bạn cần cài đặt hàm vector dijkstra(const vector< vector< pair > >&adj) nhận đầu vào danh sách kề chứa cặp pair biểu diễn đỉnh kề trọng số tương ứng cạnh Đồ thị gồm n đỉnh đánh số từ tới n-1 Hàm cần trả vector chứa n phần tử khoảng cách đường ngắn từ đỉnh tới đỉnh 0, 1, 2, , n-1 .19 Phần 2: Bài tập nhà 22 Bài tập 10: Search Engine 22 Xây dựng máy tìm kiếm (search engine) đơn giản 22 Cho N văn Q truy vấn Với truy vấn, cần trả văn khớp với truy vấn 22 Bài tập 11 Bảo vệ lâu đài 28 Bức tường bao quanh lâu đài cấu thành từ nn đoạn tường đánh số từ đến nn Quân giặc lên kế hoạch công lâu đài cách gửi aiai tên giặc đánh vào đoạn tường thứ ii Để bảo vệ lâu đài có tất cả ss lính 28 Do đoạn tường có chất lượng khác nên khả bảo vệ đoạn tường khác Cụ thể đoạn tường thứ ii, lính đẩy lùi cơng của kiki tên giặc 28 Giả sử đoạn tường thứ ii có xixi lính Khi số tên giặc khơng vượt q xi×kixi×ki thì khơng có tên giặc lọt vào qua đoạn tường Ngược lại có ai−xi×kiai−xi×ki tên giặc lọt vào lâu đài qua đoạn tường 28 Yêu cầu viết chương trình phân bố lính đứng đoạn tường cho tổng số lính là ss và tổng số lượng tên giặc lọt vào lâu đài nhỏ 28 Bài tập 12: Lược đồ 31 Cho lược đồ gồm nn cột chữ nhật liên tiếp có chiều rộng chiều cao số nguyên không âm h1,h2,…,hnh1,h2,…,hn Hãy xác định hình chữ nhật có diện tích lớn tạo thành từ cột liên tiếp 31 Dữ liệu vào: Dòng thứ chứa số nguyên dương nn (1≤n≤1061≤n≤106) Dịng thứ hai chứa nn số ngun khơng âm h1,h2,…,hnh1,h2,…,hn cách dấu cách (0≤hi≤109) .31 Kết quả: In số ngun diện tích hình chữ nhật lớn tạo thành từ cột liên tiếp lược đồ 32 Bài tập 13: Đếm xâu 34 Cho xâu nhị phân độ dài nn Hãy viết chương trình đếm số lượng xâu chứa số ký tự số ký tự 34 Dữ liệu vào: Một dòng chứa xâu nhị phân độ dài nn (1≤n≤106) .34 Kết quả: Ghi số nguyên số lượng xâu có số ký tự số ký tự .34 IT3040 – 20212 – 715027 Nguyễn Duy Khánh Linh – 20204839 IT3040 – 20212 – 715027 Nguyễn Duy Khánh Linh – 20204839 Bài thực hành 4: Thực hành sử dụng cấu trúc liệu để giải toán cụ thể Phần Bài tập thực hành Bài tập 1: Đảo ngược danh sách liên kết đơn Hãy hoàn thiện hàm thao tác danh sách liên kết: Thêm phần tử vào đầu danh sách liên kết; In danh sách; Đảo ngược danh sách liên kết (yêu cầu độ phức tạp thời gian O(N) chi phí nhớ dùng thêm O(1)) Bài làm #include using namespace std; //khởi tạo danh sách liên kết struct Node { int data; Node* next; Node(int data) { this->data = data; next = NULL; } }; // đẩy phần tử lên đầu danh sách Node* prepend(Node* head, int data) { Node* tmp = new Node(data); tmp->next = head; return tmp; } // in noi dung tren mot dong void print(Node* head) { Node *tmp = head; while(tmp != NULL){ IT3040 – 20212 – 715027 Nguyễn Duy Khánh Linh – 20204839 printf("%d ",tmp->data); tmp = tmp->next; } cout next; head->next = prev; prev = head; head = next; } // đổi ngược chiều liên kết return prev; } int main() { cout > n; Node* head = NULL; for (int i = 0; i < n; ++i){ cin >> u; head = prepend(head, u); } cout