Bài tập về mảng hai chiều¶
Đây là những bài tập dùng để luyện ngón đối với mảng hai chiều.
Các chương trình C++ trong bài này sử dụng kiểu array
hoặc con trỏ int**
, còn các chương trình Python sử dụng kiểu list
, thế nên cách viết có thể khác nhau. Nếu muốn viết gần giống với Python, bạn có thể dụng kiểu vector
của C++.
Bàn cờ vua¶
Yêu cầu¶
Viết chương trình tạo ma trận mô phỏng bàn cờ vua, nghĩa là các ô 0 và 1 xen kẽ nhau.
Input¶
n = 8 là kích thước của bàn cờ.
Output¶
0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0
Cách giải đề xuất¶
Vì trong bàn cờ, các ô 0 và 1 xen kẽ nhau theo chiều ngang lẫn chiều dọc, nên ta chỉ cần lấy tổng của chỉ số hàng và chỉ số cột của mỗi ô, chia 2 lấy dư, sẽ nhận được giá trị 0 hoặc 1 để gán cho ô đó.
Chuyển đổi qua lại giữa mảng hai chiều và mảng một chiều¶
Yêu cầu¶
Viết chương trình chuyển đổi từ mảng hai chiều thành mảng một chiều và ngược lại.
Input 1¶
Output 1¶
Input 2¶
Output 2¶
Cách giải đề xuất¶
Xét một phần tử bất kỳ trong mảng, gọi:
i
là chỉ số của phần tử này trong mảng một chiều.
r
và c
lần lượt là chỉ số hàng và chỉ số cột của phần tử này trong mảng hai chiều.
-
Chuyển đổi từ mảng hai chiều thành mảng một chiều:
Công thức tính
i
là:i = r * số-phần-tử-mỗi-hàng + c
-
Chuyển đổi từ mảng một chiều thành mảng hai chiều:
Công thức tính
r
vàc
là:r = i / số-phần-tử-mỗi-hàng
c = i % số-phần-tử-mỗi-hàng
Ma trận chuyển vị¶
Yêu cầu¶
Viết chương trình tạo ma trận chuyển vị của ma trận đã cho, nghĩa là chuyển hàng thành cột và cột thành hàng.
Input¶
Output¶
Cách giải đề xuất¶
Tam giác Pascal¶
Yêu cầu¶
Viết chương trình tạo tam giác Pascal.
Input¶
n = 10 là số hàng của tam giác Pascal.
Output¶
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
Cách giải đề xuất¶
Mỗi hàng của tam giác Pascal có đặc điểm sau:
-
Phần tử đầu tiên và phần tử cuối cùng đều là 1.
-
Mỗi phần tử ở giữa là tổng của hai phần tử thuộc hàng liền bên trên: một nằm ở cùng cột và một ở cột liền trước. Cụ thể:
a[r][c] = a[r - 1][c] + a[r - 1][c - 1]
Ma trận zigzag¶
Yêu cầu¶
Viết chương trình tạo ma trận zigzag (cách gọi khác là hình con rắn).
Input¶
n = 8 là kích thước của ma trận.
Output¶
1 2 3 4 5 6 7 8
16 15 14 13 12 11 10 9
17 18 19 20 21 22 23 24
32 31 30 29 28 27 26 25
33 34 35 36 37 38 39 40
48 47 46 45 44 43 42 41
49 50 51 52 53 54 55 56
64 63 62 61 60 59 58 57
Cách giải đề xuất¶
Mỗi hàng của ma trận zigzag có đặc điểm sau:
- Nếu là hàng chẵn 0, 2, 4, etc, thì các ô có giá trị tăng dần từ trái sang phải.
- Nếu là hàng lẻ 1, 3, 5, etc, thì các ô có giá trị tăng dần từ phải sang trái.
Ma trận xoắn ốc¶
Yêu cầu¶
Viết chương trình tạo ma trận xoắn ốc từ ngoài vào trong.
Input¶
n = 8 là kích thước của ma trận.
Output¶
1 2 3 4 5 6 7 8
28 29 30 31 32 33 34 9
27 48 49 50 51 52 35 10
26 47 60 61 62 53 36 11
25 46 59 64 63 54 37 12
24 45 58 57 56 55 38 13
23 44 43 42 41 40 39 14
22 21 20 19 18 17 16 15
Cách giải đề xuất¶
Dùng vòng lặp while, lần lượt điền số vào bốn cạnh biên của từng ma trận con (là ma trận có kích thước nhỏ hơn khi bị xoắn ốc):
- Cạnh trên: Điền số từ trái sang phải, cho đến ô liền trước cạnh phải.
- Cạnh phải: Điền số từ trên xuống dưới, cho đến ô liền trên cạnh dưới.
- Cạnh dưới: Điền số từ phải sang trái, cho đến ô liền trước cạnh trái.
- Cạnh trái: Điền số từ dưới lên trên, cho đến ô liền dưới cạnh trên.
Vòng lặp dừng khi số điền vào bằng với số lượng phần tử phải có của ma trận. Ví dụ: kích thước ma trận là 8, thì vòng lặp dừng sau khi điền số 64.
Mã nguồn¶
Code đầy đủ được đặt tại GitHub.