You are on page 1of 22

Trần Quang Huy – 20215591

CÁCH ĐÁNH GIÁ ĐIỂM THỰC HÀNH


HỌC PHẦN: IT3040 - KỸ THUẬT LẬP TRÌNH – 2022.2

I. Quy định, yêu cầu:


• Tài liệu và nội dung thực hành chấm điểm trên hệ thống:
https://lab.soict.hust.edu.vn/
• Bài tập trên lớp chấm điểm tự động (các bài không chấm trên hệ thống làm
vào máy tính  làm báo cáo thực hành – Theo mẫu).
• Hạn nộp báo cáo trên Teams (Bài tập trên lớp + Bài tập về nhà): 1 tuần.

II. Đánh giá điểm thực hành


1. Chuyên cần (đúng giờ, nghiêm túc trong giờ học) - Điểm danh trên Teams: 10%
2. Báo cáo thực hành (bài tập trên lớp + Về nhà) theo mẫu nộp trên Teams: 40%
3. Trắc nghiệm – Form trên Teams: 10%
4. Kiểm tra thực hành: 40%. (Tiết 2,3 buổi thực hành thứ 5).
Điểm thưởng: 5%  10% (Cho Mục 1,2 điểm TB từ 9-10).
Tham gia thực hành đúng giờ đầy đủ theo thời khóa biểu (nếu có lý do không đi
thực hành đúng kíp được thì gửi mail xin phép thực hành bù trước 1 ngày qua mail
hoalt@soict.hust.edu.vn, Tiêu đề: đăng ký học bù – IT3040 – MaLopTH.
Các kíp có thể bù:

TT Thời gian, địa điểm, Tuần học Mã nhóm Mã lớp


1
2
3
4
5
6
7
Nếu nghỉ không có lý do 3 buổi, không thực hành bù thì điểm chuyên cần, báo
cáo và BTVN coi như 0 điểm thực hành.

IT3040 – 2022.2 – Mã lớp TH:


Trần Quang Huy – 20215591

IT3040 – 2022.2 – Mã lớp TH:


Trần Quang Huy – 20215591

Table of Contents
Bài thực hành số 1 – Tuần 31..................................................................................................4
Bài tập 3.1. Dãy Lucas được định nghĩa bởi Ln = Ln-1 + Ln-2 với L0 = 2, L1 = 1. Hãy viết hàm tính số
Lucas thứ n......................................................................................................................................4
Bài 3.2. Trên bàn cờ vua kích thước n*n có một quân mã đang ở ô (1, 1). Hãy đưa ra một dãy các di
chuyển của mã sao cho mỗi ô trên bàn cờ đều được đi qua đúng 1 lần (ô (1, 1) được xem là đã đi
qua).................................................................................................................................................5
Bài 3.3. Một người xuất phát tại thành phố 1, muốn đi thăm tất cả các thành phố khác, mỗi thành
phố đúng 1 lần và quay về 1. Chi phí để đi từ thành phố i sang thành phố j là cij. Hãy tìm tổng chi phí
nhỏ nhất có thể................................................................................................................................9
Bài 3.4. Cho dãy a có n phần tử. Một dãy con của a là dãy thu được bằng cách xóa đi một số phần
tử của a và giữ nguyên thứ tự các phần tử còn lại (có thể không xóa phần tử nào). Hãy tìm dãy con
tăng dài nhất của a.........................................................................................................................12
Bài 3.5. Tính hệ số tổ hợp C(n, k)....................................................................................................15
Bài 3.6. Tìm ước chung lớn nhất của hai số nguyên a, b cho trước..................................................18
Bài 3.7. Sử dụng phương pháp khử đệ quy bằng stack, hãy liệt kê các xâu nhị phân độ dài n không
có k bit 1 nào liên tiếp....................................................................................................................20
Bài 3.8. Bạn đang muốn kiểm tra xem một vật cho trước có đúng nặng 𝑀� như người ta nói hay
không. Có một cân thăng bằng và 𝑛� quả cân. Quả thứ 𝑖� nặng 𝑚𝑖��. Hãy chỉ ra một cách cân
thỏa mãn. Quy cách in ra đã được tích hợp trong mã nguồn dưới..................................................21
Bài 3.9. Một y tá cần lập lịch làm việc trong 𝑁� ngày, mỗi ngày chỉ có thể là làm việc hay nghỉ ngơi.
Một lịch làm việc là tốt nếu không có hai ngày nghỉ nào liên tiếp và mọi chuỗi ngày tối đại làm việc
liên tiếp đều có số ngày thuộc đoạn [𝐾1,𝐾2][�1,�2]. Hãy liệt kê tất cả các cách lập lịch tốt, với
mỗi lịch in ra trên một dòng một xâu nhị phân độ dài 𝑛� với bit 0/1 tương ứng là nghỉ/làm việc.
Các xâu phải được in ra theo thứ tự từ điển...................................................................................21
Bài 3.10. Khoảng cách Hamming giữa hai xâu cùng độ dài là số vị trí mà ký tự tại vị trí đó là khác
nhau trên hai xâu. Cho 𝑆� là xâu gồm 𝑛� ký tự 0. Hãy liệt kê tất cả các xâu nhị phân độ dài 𝑛�,
có khoảng cách Hamming với 𝑆� bằng 𝐻�. Các xâu phải được liệt kê theo thứ tự từ điển..........21
Bài 3.11. Superior là một hòn đảo tuyệt đẹp với 𝑛� địa điểm chụp ảnh và các đường một chiều nối
các điểm chụp ảnh với nhau. Đoàn khách tham quan có 𝑟� người với sở thích chụp ảnh khác nhau.
Theo đó, mỗi người sẽ đưa ra danh sách các địa điểm mà họ muốn chụp. Bạn cần giúp mỗi người
trong đoàn lập lịch di chuyển sao cho đi qua các điểm họ yêu cầu đúng một lần, không đi qua điểm
nào khác, bắt đầu tại điểm đầu tiên và kết thúc tại điểm cuối cùng trong danh sách mà họ đưa ra,
và có tổng khoảng cách đi lại là nhỏ nhất........................................................................................22
Bài 3.12. Cho đồ thị vô hướng 𝐺�, hãy đếm số đường đi đi qua 𝑘� cạnh và không đi qua đỉnh nào
quá một lần....................................................................................................................................22

IT3040 – 2022.2 – Mã lớp TH:


Trần Quang Huy – 20215591
Bài thực hành số 1 – Tuần 31
Bài tập 3.1. Dãy Lucas được định nghĩa bởi Ln = Ln-1 + Ln-2 với L0 = 2, L1 = 1. Hãy
viết hàm tính số Lucas thứ n.

Bai 3.1

#include<stdio.h>

int lucas(int n) {

if(n==0) return 2;

if(n==1) return 1;

return lucas(n-1) + lucas(n-2);


}

IT3040 – 2022.2 – Mã lớp TH:


Trần Quang Huy – 20215591

Bài 3.2. Trên bàn cờ vua kích thước n*n có một quân mã đang ở ô (1, 1). Hãy đưa ra một
dãy các di chuyển của mã sao cho mỗi ô trên bàn cờ đều được đi qua đúng 1 lần (ô (1, 1)
được xem là đã đi qua).

IT3040 – 2022.2 – Mã lớp TH:


Trần Quang Huy – 20215591

IT3040 – 2022.2 – Mã lớp TH:


Trần Quang Huy – 20215591

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int n;
int a[100][100]; //toa do cac diem
int X[100], Y[100];

const int hx[] = {1, 1, 2, 2, -1, -1, -2, -2};

IT3040 – 2022.2 – Mã lớp TH:


Trần Quang Huy – 20215591
const int hy[] = {2, -2, 1, -1, 2, -2, 1, -1};

void print() {
for(int j = 1; j <= n*n; ++j) {
printf("(%d %d)\n", X[j], Y[j]);
}
exit(0);
}

void TRY(int k) {
for(int i = 0; i < 8; i++) {
int x1 = X[k-1] + hx[i];
int y1 = Y[k-1] + hy[i];
if(a[x1][y1] != 1 && 1 <= x1 && x1 <= n && 1 <= y1 && y1 <= n) { //Kiem tra
dieu kien co the di chuyen cua quan ma
a[x1][y1] = 1; //cap nhat diem do da duoc di qua
X[k] = x1;
Y[k] = y1;
if(k==n*n) print();
else TRY(k+1);
a[x1][y1] = 0; //de kiem tra cac nuoc co the co con lai
}
}
}

int main() {
scanf("%d", &n);
a[1][1] = 1;

IT3040 – 2022.2 – Mã lớp TH:


Trần Quang Huy – 20215591
X[1] = Y[1] = 1;
TRY(2);
return 0;
}
Bài 3.3. Một người xuất phát tại thành phố 1, muốn đi thăm tất cả các thành phố khác,
mỗi thành phố đúng 1 lần và quay về 1. Chi phí để đi từ thành phố i sang thành phố j là
cij. Hãy tìm tổng chi phí nhỏ nhất có thể

IT3040 – 2022.2 – Mã lớp TH:


Trần Quang Huy – 20215591

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define MAX 100

int n, c[MAX][MAX]; //# số thành phố và ma trận chi phí


int cmin = INT_MAX; //# chi phí đi lại nhỏ nhất giữa hai thành phố khác nhau
int best = INT_MAX; //# tổng chi phí nhỏ nhất cần tìm, ban đầu đặt bằng giá trị vô cùng
lớn INT_MAX = 2^31-1
int curr = 0; //# tổng chi phí tới thời điểm hiện tại
int mark[MAX]; //# đánh dấu những thành phố đã đi
int x[MAX]; //# lưu giữ các thành phố đã đi

//# Đọc dữ liệu vào


void input(){
cin >> n;

IT3040 – 2022.2 – Mã lớp TH:


Trần Quang Huy – 20215591
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j){
cin >> c[i][j];
if (c[i][j] > 0) cmin = min(cmin, c[i][j]);
}
}

//# Thuật toán quay lui


void TRY(int k){
for(int i = 2; i <= n; i++){
if(!mark[i]) {
x[k]=i; //danh dau dang o thanh pho nao
mark[i]=1;
curr += c[x[k-1]][i]; //cong quang duong hien tai
if(k==n) best = min(best, curr+c[x[k]][1]); //khi da di den tp thu 4, ktra gtra curr
else if((curr+(n-k+1)*cmin)< best) TRY(k+1);//neu curr + voi cmin * nhung tp
con lai tiep tuc
mark[i]=0;//danh dau thanh pho do chua di doi quang duong
curr -= c[x[k-1]][i];

}
}
}

int main() {
input();
x[1] = 1;
TRY(2);

IT3040 – 2022.2 – Mã lớp TH:


Trần Quang Huy – 20215591
cout << best;
return 0;
}
Bài 3.4. Cho dãy a có n phần tử. Một dãy con của a là dãy thu được bằng cách xóa đi
một số phần tử của a và giữ nguyên thứ tự các phần tử còn lại (có thể không xóa phần tử
nào). Hãy tìm dãy con tăng dài nhất của a.

IT3040 – 2022.2 – Mã lớp TH:


Trần Quang Huy – 20215591

#include <bits/stdc++.h>

using namespace std;

int a[1000], n;

int mem[1000]; //# mảng ghi nhớ lời giải các bài toán con đã được giải

void init(){

memset(mem, -1, sizeof(mem));

//# Quy hoạch động,

//# Hàm lis(i) trả về độ dài dãy con tăng dài nhất kết thúc bởi a[i]

int lis(int i) {

if(mem[i] != -1) return mem[i];

int res = 1;

for(int j = 0; j<i; j++){

if(a[j]<a[i]){

res = max(res,1 + lis(j));

mem[i]=res;

return res;

IT3040 – 2022.2 – Mã lớp TH:


Trần Quang Huy – 20215591

//# Truy vet loi giai

void trace(int i){

for(int j = 0; j < i; j++){

if (a[j] < a[i] && mem[i] == 1 + mem[j]){

trace(j);

break;

cout << a[i] << " ";

int main(){

init();

cin >> n;

for(int i = 0; i < n; i++) cin >> a[i];

int res = 1, pos = 0;

for(int i = 1; i < n; i++){

if (res < lis(i)){

res = lis(i);

pos = i;

cout << res << endl;

trace(pos);

return 0;

IT3040 – 2022.2 – Mã lớp TH:


Trần Quang Huy – 20215591
Bài 3.5. Tính hệ số tổ hợp C(n, k)

IT3040 – 2022.2 – Mã lớp TH:


Trần Quang Huy – 20215591

#include <iostream>

IT3040 – 2022.2 – Mã lớp TH:


Trần Quang Huy – 20215591
using namespace std;

int binom(int n, int k) {


if (k > n) return 0;
if (k == 0) return 1;
return binom(n-1, k) + binom(n-1, k-1);
}

int binom2(int n, int k){


if (k > n) return 0;
if (k == 0) return 1;
if (n == k) return 1;
int t = 1;
long long tmp_tu = 1; //bien de luu tu so
long long tmp_mau = 1;//mau so
while(t<=n-k) { //vong lap chay tu 1->n-k
tmp_tu *= (k+t);
tmp_mau *= t;
t++;
}
return tmp_tu / tmp_mau;
}

int main() {
int m;
cin >> m;
for (int n = 1; n <= m; ++n){
for (int k = 0; k <= n; ++k)

IT3040 – 2022.2 – Mã lớp TH:


Trần Quang Huy – 20215591
printf("%d ", binom(n, k));
printf("\n");
}
for (int n = 1; n <= m; ++n){
for (int k = 0; k <= n; ++k)
printf("%d ", binom2(n, k));
printf("\n");
}
return 0;
}
Bài 3.6. Tìm ước chung lớn nhất của hai số nguyên a, b cho trước.

#include <iostream>
using namespace std;

IT3040 – 2022.2 – Mã lớp TH:


Trần Quang Huy – 20215591
int gcd(int a, int b){
if (b == 0) return a;
return gcd(b, a % b);
}

int gcd2(int a, int b){


while(a!=b) {
if(a>b) a=a-b;
else b=b-a;
}
return a;

int main() {
int a, b;
cin >> a >> b;
cout << gcd(a, b) << endl << gcd2(a, b);
return 0;
}

IT3040 – 2022.2 – Mã lớp TH:


Trần Quang Huy – 20215591
Bài 3.7. Sử dụng phương pháp khử đệ quy bằng stack, hãy liệt kê các xâu nhị phân độ dài
n không có k bit 1 nào liên tiếp

IT3040 – 2022.2 – Mã lớp TH:


Trần Quang Huy – 20215591

Bài 3.8. Bạn đang muốn kiểm tra xem một vật cho trước có đúng nặng 𝑀� như người ta
nói hay không. Có một cân thăng bằng và 𝑛� quả cân. Quả thứ 𝑖� nặng 𝑚𝑖��. Hãy
chỉ ra một cách cân thỏa mãn. Quy cách in ra đã được tích hợp trong mã nguồn dưới.

Bài 3.9. Một y tá cần lập lịch làm việc trong 𝑁� ngày, mỗi ngày chỉ có thể là làm việc
hay nghỉ ngơi. Một lịch làm việc là tốt nếu không có hai ngày nghỉ nào liên tiếp và mọi
chuỗi ngày tối đại làm việc liên tiếp đều có số ngày thuộc đoạn [𝐾1,𝐾2][�1,�2]. Hãy
liệt kê tất cả các cách lập lịch tốt, với mỗi lịch in ra trên một dòng một xâu nhị phân độ
dài 𝑛� với bit 0/1 tương ứng là nghỉ/làm việc. Các xâu phải được in ra theo thứ tự từ
điển

Bài 3.10. Khoảng cách Hamming giữa hai xâu cùng độ dài là số vị trí mà ký tự tại vị trí
đó là khác nhau trên hai xâu. Cho 𝑆� là xâu gồm 𝑛� ký tự 0. Hãy liệt kê tất cả các xâu
nhị phân độ dài 𝑛�, có khoảng cách Hamming với 𝑆� bằng 𝐻�. Các xâu phải được
liệt kê theo thứ tự từ điển

IT3040 – 2022.2 – Mã lớp TH:


Trần Quang Huy – 20215591
Bài 3.11. Superior là một hòn đảo tuyệt đẹp với 𝑛� địa điểm chụp ảnh và các đường một
chiều nối các điểm chụp ảnh với nhau. Đoàn khách tham quan có 𝑟� người với sở thích
chụp ảnh khác nhau. Theo đó, mỗi người sẽ đưa ra danh sách các địa điểm mà họ muốn
chụp. Bạn cần giúp mỗi người trong đoàn lập lịch di chuyển sao cho đi qua các điểm họ
yêu cầu đúng một lần, không đi qua điểm nào khác, bắt đầu tại điểm đầu tiên và kết thúc
tại điểm cuối cùng trong danh sách mà họ đưa ra, và có tổng khoảng cách đi lại là nhỏ
nhất.

Bài 3.12. Cho đồ thị vô hướng 𝐺�, hãy đếm số đường đi đi qua 𝑘� cạnh và không đi
qua đỉnh nào quá một lần.

IT3040 – 2022.2 – Mã lớp TH:

You might also like