Mục lụcBài 4.1: Đảo ngược một danh sách liên kết đơn...4Bài 4.2: Một điểm trong không gian 2 chiều được biểu diễn bằng pair.. Hãy viết hàm tính diện tích tam giác theo tọa độ 3 đỉnh...8B
Trang 1BÁO CÁO THỰCHÀNH
KỸ THUẬT LẬPTRÌNH – IT3040
BÀI THỰC HÀNH SỐ 4 – TUẦN 38
DATA STRUCTURE
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 2Mục lục
Bài 4.1: Đảo ngược một danh sách liên kết đơn 4Bài 4.2: Một điểm trong không gian 2 chiều được biểu diễn bằng pair Hãy viết hàm tính diện tích tam giác theo tọa độ 3 đỉnh 8Bài 4.3: Một vector trong không gian 3 chiều được biểu diễn bằng tuple<double, double, double> Hãy viết hàm tính tích có hướng
của 2 vector 10
Bài 4.4: Cho hai std::vector, hãy xóa hết các phần tử chẵn, sắp xếp
giảm dần các số trong cả 2 vector và trộn lại thành một vector cũng được sắp xếp giảm dần 12
Bài 4.5: Viết hàm void dfs(vector< list<int> > adj) thực hiện thuật
toán DFS không sử dụng đệ quy trên đồ thị biểu diễn bằng danh sách kề 17
Bài 4.6: Viết hàm void bfs(vector< list<int> > adj) thực hiện thuật
toán BFS không sử dụng đệ quy trên đồ thị biểu diễn bằng danh sách kề 20
Bài 4.7: Viết các hàm thực hiện các phép giao và hợp của hai tập hợp
được biểu diễn bằng set 22
Bài 4.8: Viết các hàm thực hiện các phép giao và hợp của hai tập hợp
mờ được biểu diễn bằng map 24
Bài 4.9: Cài đặt thuật toán Dijkstra trên đồ thị vô hướng được biểu
diễn bằng danh sách kề sử dụng std::priority_queue 27
Bài 4.10: Xây dựng một máy tìm kiếm (search engine) đơn giản.Cho
N văn bản và Q truy vấn Với mỗi truy vấn, cần trả về văn bản khớp với truy vấn đó nhất.Sử dụng phương pháp tính điểm TF-IDF 30
Bài 4.11: Bức tường bao quanh một lâu đài nọ được cấu thành từ n
đoạn tường được đánh số từ 1 đến n Quân giặc lên kế hoạch tấn cônglâu đài bằng cách gửi ai tên giặc đánh vào đoạn tường thứ i Để bảo vệ lâu đài có tất cả s lính 40
Bài 4.12: Cho một lược đồ gồm n cột chữ nhật liên tiếp nhau có
chiều rộng bằng 1 và chiều cao lần lượt là các số nguyên không âm h1,h2,…,hn Hãy xác định hình chữ nhật có diện tích lớn nhất có thể tạo thành từ các cột liên tiếp 46
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 3Bài 4.13: Cho một xâu nhị phân độ dài n Hãy viết chương trình đếm
số lượng xâu con chứa số ký tự 0 và số ký tự 1 bằng nhau 48
Bài 4.1: Đảo ngược một danh sách liên kết đơn
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 4// Trần Đức Hoàng Anh 20215527// Đảo ngược sanh sách liên kết đơn#include <iostream>
using namespace std;struct Node { int data; Node* next; Node(int data) {
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 5this->data = data; next = NULL; }
// print the list content on a linevoid print(Node* head) { struct Node* temp = head; while (temp != NULL) { cout << temp->data << " "; temp = temp->next; }
// return the new head of the reversed listNode* reverse(Node* head) {
Node* current = head;
Node *prev = NULL, *next = NULL; while (current != NULL) {
head = prev;
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 6return head;}
int main() { int n, u; cin >> n;
Node* head = NULL; for (int i = 0; i < n; ++i){ cin >> u;
head = prepend(head, u); }
cout << "Reversed list: "; print(head);
return 0; }
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 7Bài 4.2: Một điểm trong không gian 2 chiều được biểu diễn bằngpair Hãy viết hàm tính diện tích tam giác theo tọa độ 3 đỉnh.
Code
// Trần Đức Hoàng Anh 20215527double area (Point a, Point b, Point c){
double first_edge = sqrt((b.first-a.first)*(b.first-a.first) +(b.second - a.second)*(b.second - a.second));
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 8double second_edge = sqrt((c.first-b.first)*(c.first-b.first) +(c.second - b.second)*(c.second - b.second));
double third_edge = sqrt((a.first-c.first)*(a.first-c.first) +(a.second - c.second)*(a.second - c.second));
double p = (first_edge + second_edge + third_edge)/2; return sqrt(p*(p-first_edge)*(p-second_edge)*(p-third_edge));};
Bài 4.3: Một vector trong không gian 3 chiều được biểu diễn
bằng tuple<double, double, double>. Hãy viết hàm tính tích có hướng của 2 vector.
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 10get<1>(result) = get<2>(a)*get<0>(b) - get<0>(a) * get<2>(b);
get<2>(result) = get<0>(a)*get<1>(b) - get<1>(a) * get<0>(b);
return result;}
Bài 4.4: Cho hai std::vector, hãy xóa hết các phần tử chẵn, sắp
xếp giảm dần các số trong cả 2 vector và trộn lại thành một vector cũng được sắp xếp giảm dần.
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 11IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 12IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 13Code
// Cho hai std::vector,
// hãy xóa hết các phần tử chẵn, sắp xếp giảm dần các số trong cả 2 vector
// và trộn lại thành một vector cũng được sắp xếp giảm dần.#include <iostream>
#include <vector>#include <algorithm>using namespace std;
void print_vector(const vector<int> &a) { for (int v : a) cout << v << ' ';
cout << endl;}
void delete_even(vector<int> &a) { for (auto i = a.begin(); i != a.end(); ++i) {
if (*i % 2 == 0) { a.erase(i); i ; } }}
void sort_decrease(vector<int> &a) { sort(a.begin(), a.end(), greater<int>());}
vector<int> merge_vectors(const vector<int> &a, const vector<int> &b) {
vector<int> v(a.size() + b.size()); vector<int>::iterator it, st; it = set_union(a.begin(), a.end(),
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 14b.begin(), b.end(), v.begin());
sort(v.begin(), v.end(), greater<int>());
return v;}
int main() { int m, n, u;
std::vector<int> a, b;
std::cin >> m >> n; for(int i = 0; i < m; i++){ std:: cin >> u; a.push_back(u); }
for(int i = 0; i < n; i++){ std:: cin >> u; b.push_back(u); }
Trang 15print_vector(b);
vector<int> c = merge_vectors(a, b); cout << "Decreasingly sorted c: "; print_vector(c);
return 0;}
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 16Bài 4.5: Viết hàm void dfs(vector< list<int> > adj) thực hiện
thuật toán DFS không sử dụng đệ quy trên đồ thị biểu diễn bằng danh sách kề.
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 17
while(!S.empty()) {
int u = S.top();
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 18if(!visited[u]) {
visited[u] = true;
std::cout<<u<<std::endl; }
if(!adj[u].empty()) {
int v = adj[u].front(); adj[u].pop_front(); if(!visited[v]) {
S.push(v); }
} else {
S.pop(); }
}}
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 19Bài 4.6: Viết hàm void bfs(vector< list<int> > adj) thực hiện
thuật toán BFS không sử dụng đệ quy trên đồ thị biểu diễn bằng danh sách kề.
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 20IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 21visited[1] = true; while(!Q.empty()) {
int u = Q.front(); Q.pop();
cout << u << "\n"; for(auto v : adj[u]) {
if(!visited[v]) {
visited[v] = true; Q.push(v); }
} }}
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 22Bài 4.7: Viết các hàm thực hiện các phép giao và hợp của hai tập
hợp được biểu diễn bằng set
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 23IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 24if(b.count(*it)) result.insert(*it); }
return result;}
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 25
for (auto it = b.begin(); it != b.end(); ++it) result.insert(*it);
return result;}
Bài 4.8: Viết các hàm thực hiện các phép giao và hợp của hai tập
hợp mờ được biểu diễn bằng map.
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 26IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 27result[p.first] = max(result[p.first], p.second); }
else {
result.insert(p); }
}
return result;}
const auto it = b.find(p.first); if(it != b.end())
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 28Bài 4.9: Cài đặt thuật toán Dijkstra trên đồ thị vô hướng được
biểu diễn bằng danh sách kề sử dụng std::priority_queue
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 29IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 30while (!Q.empty()) { int u = Q.top().second; Q.pop();
for (const pair<int, int> &e : adj[u]) { int v = e.first;
int w = e.second;
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 31if (dist[v] > dist[u] + w) { dist[v] = dist[u] + w; Q.push({dist[v], v}); }
} }
return dist;}
Bài 4.10: Xây dựng một máy tìm kiếm (search engine) đơn
giản.Cho N văn bản và Q truy vấn Với mỗi truy vấn, cần trả về văn bản khớp với truy vấn đó nhất.Sử dụng phương pháp tính điểm TF-IDF.
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 32IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 33IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 34IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 35IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 36#include<bits/stdc++.h>using namespace std;
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 37while (!str.empty()){
string tmp = str.substr(0, str.find(",")); int pos = tmp.find(" ");
if(pos > tmp.size()) vt.push_back(tmp); else {
while(pos <= tmp.size()){ tmp.erase(pos,1); pos = tmp.find(" "); }
vt.push_back(tmp); }
if (str.find(",") > str.size()){ break;
} else {
str.erase(0, str.find(",") + 1); }
} return vt;}
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 38// inputvoid input(){
vector<string> document_train; vector<string> document_test; cin >> n;
string str_tmp; getline(cin, str_tmp); for(int i=0; i<n; i++){ string str_tmp; getline(cin, str_tmp);
document_train.push_back(str_tmp); }
cin >> q;
getline(cin, str_tmp); for(int i=0; i<q; i++){ string str_tmp; getline(cin, str_tmp);
document_test.push_back(str_tmp); }
for(string v : document_train){
vector<string> element = split_string(v); vector_train.push_back(element); }
for(string v : document_test){
vector<string> element = split_string(v); vector_test.push_back(element);
}}
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 39// preprocessingvoid pre_processing(){
// tinh tan suat tu xuat hien nhieu nhat trong van ban i for(vector<string> str_tmp : vector_train){
m.insert({word_tmp, 1}); } else {
ite->second += 1; }
max_f = max(m[word_tmp], max_f); }
f_max.push_back(max_f); }
// tinh xem word xuat hien bao nhieu lan trong van ban iint frequence_word_int_document_i(string word, int i){ if(fe.find({word, i}) != fe.end()){ // neu da co trong kho luu tru thi lay ra va tra ve
return fe[{word, i}]; }
int index = 0;
vector<string> str_tmp = vector_train[i]; for(string v : str_tmp){
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 40if(word == v) index++; }
fe.insert({{word, i}, index}); return index;
// tinh xem tu word nam trong bao nhieu van ban
int count_document_contain_word(string word){ // neu da co trong kho luu tru thi lay ket qua va tra ve
if(df.find(word) != df.end()){ return df[word];
} }
df.insert({word,index}); return index;
// du doan van ban
int search_engine(vector<string> list_word){ double score_max = -1000;
int predict_label = -1; for(int i=0; i<n; i++){
vector<string> list_word_train_doc = vector_train[i]; double score = 0;
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 41for(string word : list_word){
if(find(list_word_train_doc.begin(),
list_word_train_doc.end(), word) == list_word_train_doc.end()){ // tu nay khong xuat hien trong van ban
continue; } else {
int ftd = frequence_word_int_document_i(word, i); int dft = count_document_contain_word(word); int maxfd = f_max[i];
double tf_word = 0.5 + 0.5 * ((double) ftd / maxfd); double idf_word = log2((double) n / dft);
score += tf_word * idf_word; }
}
if(score > score_max) { predict_label = i; score_max = score; }
}
return predict_label + 1;}
int main(){
ios_base::sync_with_stdio(false); cin.tie(NULL); input();
pre_processing(); for(int i=0; i<q; i++)
cout << search_engine(vector_test[i]) << endl; return 0;
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 42IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 43Bài 4.11: Bức tường bao quanh một lâu đài nọ được cấu thành từ
n đoạn tường được đánh số từ 1 đến n Quân giặc lên kế hoạch tấn công lâu đài bằng cách gửi ai tên giặc đánh vào đoạn tường thứ i Để bảo vệ lâu đài có tất cả s lính.
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 44IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 45IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 46#include <bits/stdc++.h>using namespace std;
// Trần Đức Hoàng Anh 20215527struct data
{ int ai; int ki;
data(int ai, int ki) {
this->ai = ai; this->ki = ki; }
struct compare{
bool operator()(data a, data b) {
int ra, rb; if (a.ai <= a.ki) ra = a.ai; else ra = a.ki; if (b.ai <= b.ki) rb = b.ai; else rb = b.ki; return ra < rb; }
int n, s, kill_enemy, total_enemy;
priority_queue<data, vector<data>, compare> p_q;
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 47void input(){
cin >> n >> s; kill_enemy = 0; total_enemy = 0; for (int i = 0; i < n; i++) {
int tmp1, tmp2; cin >> tmp1 >> tmp2; total_enemy += tmp1; p_q.push(data(tmp1, tmp2)); }
void solve(){
while (!p_q.empty() && s > 0) {
data inf = p_q.top(); p_q.pop();
if (inf.ai <= inf.ki) {
kill_enemy += inf.ai; }
else {
int nenemy = inf.ai - inf.ki; p_q.push(data(nenemy, inf.ki)); kill_enemy += inf.ki;
} s -= 1; }}
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 48int main(){
input(); solve();
cout << total_enemy - kill_enemy; return 0;
// Trần Đức Hoàng Anh 20215527
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 49Bài 4.12: Cho một lược đồ gồm n cột chữ nhật liên tiếp nhau có
chiều rộng bằng 1 và chiều cao lần lượt là các số nguyên không âm h1,h2,…,hn Hãy xác định hình chữ nhật có diện tích lớn nhấtcó thể tạo thành từ các cột liên tiếp.
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 50#include <bits/stdc++.h>
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 51using namespace std;
// Trần Đức Hoàng Anh 20215527int main() {
int n; cin >> n; vector<int> h(n);
for (int i = 0; i < n; i++) { h.push_back(1000); }
int ans = 0; stack<int> st; h.push_back(0);
for (int i = 0; i < h.size(); i++) {
while (!st.empty() && h[st.top()] >= h[i]) { int height = h[st.top()];
cout << ans << endl; return 0;
IT3040 – 2022.2 – Mã lớp TH: 727639
Trang 52Bài 4.13: Cho một xâu nhị phân độ dài n Hãy viết chương trình
đếm số lượng xâu con chứa số ký tự 0 và số ký tự 1 bằng nhau.
#include <bits/stdc++.h>using namespace std;
// Trần Đức Hoàng Anh 20215527int main() {
string s; cin >> s;
IT3040 – 2022.2 – Mã lớp TH: 727639