Danh mục hình ảnh 3 Bài thực hành số 1: Con trỏ và cấp phát 5 Phần 1. Thực hành về con trỏ 5 1. Bài tập 1: 5 2. Bài tập 2: 6 3. Bài tập 3: 7 4. Bài tập 4: 8 5. Bài tập 5: 10 6. Bài tập 6: 11 7. Bài tập 7: 13 8. Bài tập 8 15 Phần 2. Bài tập về nhà 18 Bài tập 9 18 Bài tập 10 20 Bài thực hành số 2: Hàm và tối ưu mã nguồn 24 Phần 1. Thực hành về hàm 24 1.1 Truyền tham trị, tham chiếu và tham số ngầm định 24 1.2 Đa năng hóa hàm 28 1.3 Con trỏ hàm và tham số hóa hàm 32 1.4 Biểu thức lamda và hàm nặc danh 35 Phần 2. Thực hành về tối ưu mã nguồn 36 Bài tập 9 :Tính hàm sigmoid 36 Bài tập 10 (bonus): Tính tích hai ma trận vuông 40 Phần 3. Bài tập về nhà 45 Bài tập 11: Tính tích hai đa thức 45 Bài thực hành số 3: Đệ quy và khử đệ quy để giải quyết một số bài toán 48 Phần 1. Thực hành về đệ quy 48 1.1 Đệ quy quay lui 48 1.2 Kỹ thuật nhánh cận 51 1. Đệ quy có nhớ 54 Phần 2. Khử đệ quy 56 Bài tập 5: Tính tổ hợp 56 Bài tập 6: Tìm ước chung lớn nhất 58 Bài tập 7: Liệt kê xâu nhị phân 60 Bài tập 8: Cân đĩa 62 Phần 3. Bài tập về nhà 64 Bài tập 9 : Lập lịch cho y tá 64 Bài tập 10 Khoảng cách Hamming 67 Bài tập 11: Lịch trình chụp ảnh 70 Bài tập 12 : Đếm đường đi 74 Bài thực hành số 4: Thực hành sử dụng các cấu trúc dữ liệu cơ bản để giải quyết các bài toán cụ thể 76 Phần 1. Bài tập thực hành 76 Bài tập 1: Đảo ngược một danh sách liên kết đơn 76 Bài tập 2: Tính diện tích tam giác 78 Bài tập 3: Tính tích có hướng của 2 vector 79 Bài tập 4: Thao tác với vector 81 Bài tập 5: 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ề. 83 Bài tập 6: Thực hiện thuật toán BFS trên đồ thị biểu diễn bằng danh sách kề. 86 Bài tập 7: 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 88 Bài tập 8: 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. 90 Bài tập 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 priority_queue 93 Phần 2. Bài tập về nhà 96 Bài tập 10: Search Engine 96 Bài thực hành số 5: Thực hành gỡ rối, kiểm thử và tinh chỉnh mã nguồn 101 Phần 1. Thực hành gỡ rối 101 1.1 Hướng dẫn tìm một số lỗi cú pháp (Syntax Error) thường gặp 101 1.2 Thực hành sửa lỗi cú pháp 101 Bài tập 1: Tìm và sửa các lỗi cú pháp 101 Bài tập 2: Tìm và sửa các lỗi cú pháp 102 1.3 Hướng dẫn tìm một số lỗi thực thi (Runtime Error) 104 1.4 Hướng dẫn tìm một số lỗi logic 104 1.5 Tìm vị trí lỗi bằng trình debug 104 1.6 Tìm vị trí lỗi bằng cách in ra màn hình file log 104 1.7 Thực hành sửa lỗi thực thi và lỗi logic 104 Bài tập 3 : Dãy Ngoặc Đúng 104 Phần 2. Kiểm thử 107 2.1 Hướng dẫn 107 2.2 Thực hành 107 Bài tập 4: Bài toán người du lịch 107 Phần 3. Tinh chỉnh mã nguồn 113 Bài tập 5: Năm nhuận 113 Bài tập 6: Tổng kết 114 Bài tập 7: Chia tiền 116
Trang 1Danh mục hình ảnh 3
Bài thực hành số 1: Con trỏ và cấp phát 5
Phần 1 Thực hành về con trỏ 5
1 Bài tập 1: 5
2 Bài tập 2: 6
3 Bài tập 3: 7
4 Bài tập 4: 8
5 Bài tập 5: 10
6 Bài tập 6: 11
7 Bài tập 7: 13
8 Bài tập 8 15
Phần 2 Bài tập về nhà 18
Bài tập 9 18
Bài tập 10 20
Bài thực hành số 2: Hàm và tối ưu mã nguồn 24
Phần 1 Thực hành về hàm 24
1.1 Truyền tham trị, tham chiếu và tham số ngầm định 24
1.2 Đa năng hóa hàm 28
1.3 Con trỏ hàm và tham số hóa hàm 32
1.4 Biểu thức lamda và hàm nặc danh 35
Phần 2 Thực hành về tối ưu mã nguồn 36
Bài tập 9 :Tính hàm sigmoid 36
Bài tập 10 (bonus): Tính tích hai ma trận vuông 40
Phần 3 Bài tập về nhà 45
Bài tập 11: Tính tích hai đa thức 45
Bài thực hành số 3: Đệ quy và khử đệ quy để giải quyết một số bài toán 48
Phần 1 Thực hành về đệ quy 48
1.1 Đệ quy - quay lui 48
1.2 Kỹ thuật nhánh cận 51
1 Đệ quy có nhớ 54
Phần 2 Khử đệ quy 56
Trang 2Bài tập 5: Tính tổ hợp 56
Bài tập 6: Tìm ước chung lớn nhất 58
Bài tập 7: Liệt kê xâu nhị phân 60
Bài tập 8: Cân đĩa 62
Phần 3 Bài tập về nhà 64
Bài tập 9 : Lập lịch cho y tá 64
Bài tập 10 Khoảng cách Hamming 67
Bài tập 11: Lịch trình chụp ảnh 70
Bài tập 12 : Đếm đường đi 74
Bài thực hành số 4: Thực hành sử dụng các cấu trúc dữ liệu cơ bản để giải quyết các bài toán cụ thể 76
Phần 1 Bài tập thực hành 76
Bài tập 1: Đảo ngược một danh sách liên kết đơn 76
Bài tập 2: Tính diện tích tam giác 78
Bài tập 3: Tính tích có hướng của 2 vector 79
Bài tập 4: Thao tác với vector 81
Bài tập 5: 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ề 83
Bài tập 6: Thực hiện thuật toán BFS trên đồ thị biểu diễn bằng danh sách kề 86
Bài tập 7: 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 88
Bài tập 8: 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 90
Bài tập 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 priority_queue 93
Phần 2 Bài tập về nhà 96
Bài tập 10: Search Engine 96
Bài thực hành số 5: Thực hành gỡ rối, kiểm thử và tinh chỉnh mã nguồn 101
Phần 1 Thực hành gỡ rối 101
1.1 Hướng dẫn tìm một số lỗi cú pháp (Syntax Error) thường gặp 101
1.2 Thực hành sửa lỗi cú pháp 101
Bài tập 1: Tìm và sửa các lỗi cú pháp 101
Bài tập 2: Tìm và sửa các lỗi cú pháp 102
1.3 Hướng dẫn tìm một số lỗi thực thi (Runtime Error) 104
1.4 Hướng dẫn tìm một số lỗi logic 104
1.5 Tìm vị trí lỗi bằng trình debug 104
1.6 Tìm vị trí lỗi bằng cách in ra màn hình / file log 104
Trang 31.7 Thực hành sửa lỗi thực thi và lỗi logic 104
Bài tập 3 : Dãy Ngoặc Đúng 104
Phần 2 Kiểm thử 107
2.1 Hướng dẫn 107
2.2 Thực hành 107
Bài tập 4: Bài toán người du lịch 107
Phần 3 Tinh chỉnh mã nguồn 113
Bài tập 5: Năm nhuận 113
Bài tập 6: Tổng kết 114
Bài tập 7: Chia tiền 116
Danh m c hình nh ục hình ảnh ảnh Hình 1 Bài 1.1 Phép toán & trả về địa chỉ của biến 6
Hình 2 Bài 1.2 Phép toán & trả về địa chỉ của biến 7
Hình 3 Bài 1.3 Phép toán & trả về địa chỉ của biến 8
Hình 4 Bài 1.4 Con trỏ và mảng 9
Hình 5 Bài 1.5 Con trỏ và mảng 11
Hình 6 Bài 1.6 Con trỏ và mảng 13
Hình 7 Bài 1.7 Cấp phát động 15
Hình 8 Bài 1.8 Cấp phát động 18
Hình 9 Bài 1.9 20
Hình 10 Bài 1.10 23
Hình 1 Bài 2.1 Truyền tham trị 24
Hình 2 Bài 2.2 Truyền tham chiếu 26
Hình 3 Bài 2.3 Tham số ngầm định 28
Hình 4 Bài 2.4 Đa năng hóa hàm 29
Hình 5 Bài 2.5 Đa năng hóa toán tử 31
Hình 6 Bài 2.6 Con trỏ hàm 33
Hình 7 Bài 2.7 Khái quát hóa hàm 35
Hình 8 Bài 2.8 Sắp xếp 36
Hình 9 Bài 2.9 Tính hàm sigmoid 40
Hình 10 Bài 2.10 Tích hai ma trận vuông 44
Hình 11 Bài 2.11 Tích hai đa thức 48
Hình 1 Bài 3.1 Dãy Lucas 49
Hình 2 Bài 3.2 Quân mã đi tuần 51
Hình 3 Bài 3.3 Bài toán người du lịch 53
Hình 4 Bài 3.4 LIS 56
Trang 4Hình 5 Bài 3.5 Tính tổ hợp 58
Hình 6 Bài 3.6 Tính ước chung lớn nhất 60
Hình 7 Bài 3.7 Liệt kê xâu nhị phân 62
Hình 8 Bài 2.8 Sắp xếp 64
Hình 9 Bài 3.9 Lập lịch cho y tá 67
Hình 10 Bài 3.10 Khoảng cách Hamming 70
Hình 11 Bài 3.11 Lịch trình chụp ảnh 74
Hình 12 Bài 3.12 Đếm đường đi 76
Hình 1 Bài 4.1 Danh sách liên kết đơn 78
Hình 2 Bài 4.2 Tính diện tích tam giác 79
Hình 3 Bài 4.3 Tích có hướng của 2 vector 81
Hình 4 Bài 4.4 Thao tác với vector 83
Hình 5 Bài 4.5 DFS 86
Hình 6 Bài 4.6 BFS 88
Hình 7 Bài 4.7 Set 90
Hình 8 Bài 4.8 Map 93
Hình 9 Bài 4.9 Dijkstra 96
Hình 10 Bài 4.10 Search engine 100
Hình 1 Bài 5.1 Tìm và sửa các lỗi cú pháp 102
Hình 2 Bài 5.2 Tìm và sửa lỗi cú pháp 103
Hình 3 Bài 5.3 Tìm dãy ngoặc đúng 107
Hình 4 Bài 5.4 Bài toán người du lịch 113
Hình 5 Bài 5.5 Năm nhuận 114
Hình 6 Bài 5.6 Điểm tổng kết 116
Hình 7 Bài 5.7 Chia tiền 117
Trang 5Bài th c hành s 1: Con tr và c p phát ực hành số 1: Con trỏ và cấp phát ố 1: Con trỏ và cấp phát ỏ và cấp phát ấp phát
Ph n 1 Th c hành v con tr ần 1 Thực hành về con trỏ ực hành số 1: Con trỏ và cấp phát ề con trỏ ỏ và cấp phát
1 Bài t p 1: ập 1:
Viết một chương trình C nhập vào 3 số nguyên Thiết lập một con trỏ để lần lượt trỏ tới từng số nguyên và hiển thị kết quả giá trị tham chiếu ngược của con trỏ Lưu ý: Phép toán & trả về địa chỉ của biến.
Tên file: 20183555-NguyenXuanHuy_Bai 1_1.cpp
printf("Enter three integers: ");
scanf("%d %d %d", &x, &y, &z);
printf("\nThe three integers are:\n");
Trang 6Hình 1 Bài 1.1 Phép toán & trả về địa chỉ của biến
2 Bài t p 2: ập 1:
Viết chương trình in ra địa chỉ của 5 phần tử đầu tiên trong mảng được định nghĩa sau đây: int a[7]= {13, -355, 235, 47, 67, 943, 1222}; Lưu ý: Để in địa chỉ con trỏ các bạn sử dụng ký tự định dạng %p
Tên file: 20183555-NguyenXuanHuy_Bai 1_2.cpp
printf("address of first five elements in memory.\n");
for (i=0; i<5;i++)
{
printf("\ta[%d]",i);
printf("\n");
printf("address: %p \n",a+i);
Trang 9int count =0;
for(i=0;i<size;i++){
if((*(arr+i)%2)==0){ count++; } }
Trang 13Hình 6 Bài 1.6 Con trỏ và mảng
Viết chương trình nhập vào một mảng các số nguyên với số lượng các phần tử nhập từ bàn phím Sau đósắp xếp mảng theo thứ tự tăng dần Hiển thị danh sách mảng trước và sau khi sắp xếp Yêu cầu chỉ sử dụng con trỏ để truy cập mảng, không truy cập theo index mảng
Tên file: 20183555-NguyenXuanHuy_Bai 1_7.cpp
Trang 14printf("The sorted array is: \n");
for( i = 0; i < n; i++){ printf("%d ", *(a + i));
printf("\n");
} free(a);
return 0;
}
Trang 15}
Trang 16void output(int **mt, int m, int n){
Trang 17scanf("%d %d", &m, &n);
mt = (int **)malloc(m * sizeof(int *));
Trang 19free(arr);
return 0;
}
Trang 20Hình 9 Bài 1.9
Bài t p 10 ập 1:
Viết chương trình nhập vào 2 ma trận vuông cùng kích thước n*n, trong đó n nhập từ bàn phím Sau đó tính tổng và tích của hai ma trận đó và đưa kết quả ra màn hình Yêu cầu sử dụng cấp phát động để cấp phát bộ nhớ cho các ma trận
Tên file: 20183555-NguyenXuanHuy_Bai 1_10.cpp
Trang 22printf("%d ",*(*(mt1+i)+j)+*(*(mt2+i)+j));
} printf("\n");
} printf("\n");
int **mt1 = (int **)malloc(n * sizeof(int *));
int **mt2 = (int **)malloc(n * sizeof(int *));
for (i = 0; i < n; i++)
{
Trang 23mt1[i] = (int *)malloc(n * sizeof(int));
mt2[i] = (int *)malloc(n * sizeof(int));
Trang 24Bài th c hành s 2: Hàm và t i u mã ngu n ực hành số 1: Con trỏ và cấp phát ố 1: Con trỏ và cấp phát ố 1: Con trỏ và cấp phát ưu mã nguồn ồn
Ph n 1 Th c hành v hàm ần 1 Thực hành về con trỏ ực hành số 1: Con trỏ và cấp phát ề con trỏ
1.1 Truy n tham tr , tham chi u và tham s ng m đ nh ề con trỏ ị, tham chiếu và tham số ngầm định ếu và tham số ngầm định ố 1: Con trỏ và cấp phát ần 1 Thực hành về con trỏ ị, tham chiếu và tham số ngầm định
Bài t p 1: Truy n tham tr ập 1: Truyền tham trị ền tham trị ị
Viết hàm tính độ dài cạnh huyền của tam giác theo độ hai cạnh góc vuông
Tên file: 20183555-NguyenXuanHuy_Bai 2_1.cpp
Trang 25Bài t p 2: Truy n tham chi u ập 1: Truyền tham trị ền tham trị ếu
Viết hàm hoán vị vòng tròn 3 biến a, b, c Sau khi thực hiện hàm, các biến a, b, c tương ứng nhận các giátrị mới b, c, a
Tên file: 20183555-NguyenXuanHuy_Bai 2_2.cpp
Trang 26Hình 12 Bài 2.2 Truyền tham chiếu
Bài t p 3: Tham s ng m đ nh ập 1: Truyền tham trị ố ngầm định ầm định ị
Viết chương trình yêu cầu nhập giá trị cho số nguyên x nhỏ hơn 100 In ra giá trị ax2 + bx + c với a, b, c định sẵn
Tên file: 20183555-NguyenXuanHuy_Bai 2_3.cpp
Trang 28Hình 13 Bài 2.3 Tham số ngầm định
1.2 Đa năng hóa hàm
Bài t p 4: Đa năng hóa hàm ập 1: Truyền tham trị
Viết các hàm tính lập phương của số nguyên và số thực
Tên file: 20183555-NguyenXuanHuy_Bai 2_4.cpp
Trang 29cout << "Double: " << cube(17.1) << endl;
return 0;
}
Hình 14 Bài 2.4 Đa năng hóa hàm
Bài t p 5: Đa năng hóa toán t ập 1: Truyền tham trị ử
Viết các toán tử tính tổng, hiệu, tích và thương của hai số phức Tên file:
Trang 31ostream& operator << (ostream& out, const Complex &a) {
out << '(' << a.real << (a.imag >= 0 ? '+' : '-') << fabs(a.imag) << 'i' << ')';
Trang 321.3 Con tr hàm và tham s hóa hàm ỏ và cấp phát ố 1: Con trỏ và cấp phát
Bài t p 6: Con tr hàm ập 1: Truyền tham trị ỏ hàm
Giả thuyết Collatz: bắt đầu từ số dương n bất kỳ, nếu n chẵn thì chia 2, nếu lẻ thì nhân 3 cộng 1, giả thuyết cho rằng ta luôn đi đến n = 1 Hãy viết chương trình mô phỏng lại quá trình biến đổi để kiếm chứng giả thuyết với một vài giá trị của n
Tên file: 20183555-NguyenXuanHuy_Bai 2_6.cpp
Trang 33int (*odd)(int) = NULL;
int (*even)(int) = NULL;
Bài t p 7: Khái quát hóa hàm ập 1: Truyền tham trị
Viết hàm tính tổng các phần từ trong hai mảng Yêu cầu sử dụng function template để cho phép hàm làm việc với các mảng số nguyên lẫn số thực
Tên file: 20183555-NguyenXuanHuy_Bai 2_7.cpp
#include <iostream>
using namespace std;
template <typename T>
Trang 34T arr_sum(T *a,int n,T *b,int m){
Trang 35Hình 17 Bài 2.7 Khái quát hóa hàm
1.4 Bi u th c lamda và hàm n c danh ểu thức lamda và hàm nặc danh ức lamda và hàm nặc danh ặc danh
Bài t p 8: S p X p ập 1: Truyền tham trị ắp Xếp ếu
Viết hàm so sánh cho thuật toán sắp xếp
Tên file: 20183555-NguyenXuanHuy_Bai 2_8.cpp
Trang 37Ph n 2 Th c hành v t i u mã ngu n ần 1 Thực hành về con trỏ ực hành số 1: Con trỏ và cấp phát ề con trỏ ố 1: Con trỏ và cấp phát ưu mã nguồn ồn
Dưới đây cung cấp đoạn code đơn giản để tính hàm sigmoid theo công thức trực tiếp Hãy viết hàm tính xấp xỉ sigmoid(x) đến độ chính xác 10−6 và có tốc độ nhanh hơn ít nhất 30% so với code đơn giản Gợi ý:
sử dụng kỹ thuật "chuẩn bị trước" như trong slide
Tên file: 20183555-NguyenXuanHuy_Bai 2_9.cpp
const int LIMIT = 100;
const int NUM_ITER = 100000;
const int NUM_INPUTS = NUM_ITER * 100;
const int PRECISION = 1000000;
const double RANGE = LIMIT / 20.0;
for (int i = 0; i < NUM_INPUTS; ++i) {
x[i] = RANGE * (rand() % PRECISION - rand() % PRECISION) / PRECISION;
}
}
const int N=100000;
double y[N+1];
Trang 38const double LIM=20; //[-20;20]
static double delta=LIM*2/N;
double benchmark(double (*calc)(double), vector<double> &result) {
const int NUM_TEST = 1000;
double taken = 0;
result = vector<double>();
result.reserve(NUM_ITER);
int input_id = 0;
clock_t start = clock();
for (int t = 0; t < NUM_TEST; ++t) {
double sum = 0;
for (int i = 0; i < NUM_ITER; ++i) {
double v = fabs(calc(x[input_id]));
sum += v;
Trang 39if (t == 0) result.push_back(v);
if ((++input_id) == NUM_INPUTS) input_id = 0;
}
}
clock_t finish = clock();
taken = (double)(finish - start);
printf("Time: %.9f\n", taken / CLOCKS_PER_SEC);
return taken;
}
bool is_correct(const vector<double> &a, const vector<double> &b) {
const double EPS = 1e-6;
if (a.size() != b.size()) return false;
for (int i = 0; i < a.size(); ++i) {
if (fabs(a[i] - b[i]) > EPS) {
Trang 40Dưới đây cung cấp đoạn code đơn giản để tính tích của hai ma trận cỡ NxN theo công thức trực tiếp Hãy viết hàm tính tích hai ma trận nhưng có tốc độ nhanh hơn ít nhất 10% so với code đơn giản Gợi ý: hãy để ý đến thứ tự truy cập các phần tử trong ma trận, tối ưu cache hoặc sử dụng thuật toán tốt hơn O(N3 ).
Tên file: 20183555-NguyenXuanHuy_Bai 2_10.cpp
#include <iostream>
#include <cstring>
Trang 41bool operator == (const Matrix &a, const Matrix &b) {
for (int i = 0; i < N; ++i) {
Trang 43for (int t = 0; t < NUM_TEST; ++t) {
clock_t start = clock();
for (int i = 0; i < NUM_ITER; ++i) {
a = multiply(a, result);
result = multiply(result, a);
}
clock_t finish = clock();
taken += (double)(finish - start);
Trang 45Hình 20 Bài 2.10 Tích hai ma trận vuông
Ph n 3 Bài t p v nhà ần 1 Thực hành về con trỏ ập 1: ề con trỏ
Bài t p 11: Tính tích hai đa th c ập 1: ức lamda và hàm nặc danh
Cho 2 đa thức A(x) và B(x) tương ứng có bậc n và m Hãy tính đa thức tích C(x) = A(x) * B(x) có bậc n + m
Tên file: 20183555-NguyenXuanHuy_Bai 2_11.cpp
#include <bits/stdc++.h>
Trang 46#include<complex>
using namespace std;
using cd = complex<double>;
const double PI = acos(-1);
void fft(vector<cd> & a, bool invert) {
int n = a.size();
if (n == 1)
return;
vector<cd> a0(n / 2), a1(n / 2);
for (int i = 0; 2 * i < n; i++) {
for (int i = 0; 2 * i < n; i++) {
a[i] = a0[i] + w * a1[i];
a[i + n/2] = a0[i] - w * a1[i];
if (invert) {
a[i] /= 2;
a[i + n/2] /= 2;
}
Trang 47w *= wn;
}
}
vector<int> multiply(vector<int> const& a, vector<int> const& b) {
vector<cd> fa(a.begin(), a.end()), fb(b.begin(), b.end());
Trang 49Hình 211 Bài 2.11 Tích hai đa thức
Bài th c hành s 3: Đ quy và kh đ quy đ gi i quy t m t s bài toán ực hành số 1: Con trỏ và cấp phát ố 1: Con trỏ và cấp phát ệ quy và khử đệ quy để giải quyết một số bài toán ử đệ quy để giải quyết một số bài toán ệ quy và khử đệ quy để giải quyết một số bài toán ểu thức lamda và hàm nặc danh ảnh ếu và tham số ngầm định ột số bài toán ố 1: Con trỏ và cấp phát
Ph n 1 Th c hành v đ quy ần 1 Thực hành về con trỏ ực hành số 1: Con trỏ và cấp phát ề con trỏ ệ quy và khử đệ quy để giải quyết một số bài toán
1.1 Đ quy - quay lui ệ quy và khử đệ quy để giải quyết một số bài toán
Bài t p 1: Tính dãy Lucas ập 1: Truyền tham trị
Tên file: 20183555-NguyenXuanHuy_Bai 3_1.cpp
Trang 50Hình 22 Bài 3.1 Dãy Lucas
Bài t p 2: Quân mã đi tu n ập 1: Truyền tham trị ầm định
Trên bàn cờ vua kích thước n×nn×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)
Tên file: 20183555-NguyenXuanHuy_Bai 3_2.cpp
#include <bits/stdc++.h>
int n, X[100], Y[100], mark[100][100]={0};
const int hx[] = {1, 1, 2, 2, -1, -1, -2, -2};
const int hy[] = {2, -2, 1, -1, 2, -2, 1, -1};
void process(int i, int x, int y){
Trang 51exit(0);
}
for(tmp=0;tmp<8;tmp++){
.int u=x+hx[tmp]; int v=y+hy[tmp];
if(u >= 1 && u < n &&v >= 1 && v < n && mark[u][v] == 0)
{
mark[u][v]=i; X[i]=u; Y[i]=v; i++; process(i,u,v); .mark[u][v] = 0; .} }