Bài viết này mình sẽ hướng dẫn các bạn những bài toán thường gặp trên mảng 2 chiều.
1. Bài Toán Liệt Kê
Dạng bài này thường yêu cầu bạn đếm hoặc liệt kê các phần tử trong mảng 2 chiều thỏa mãn tính chất cho trước như : số nguyên tố, thuận nghịch, hoàn hảo, fibonacci...
Đối với dạng bài tập này bạn chỉ cần biết duyệt mảng 2 chiều là có thể làm được.
Ví dụ 1 : Tìm phần tử nhỏ nhất, lớn nhất trong mảng 2 chiều
#include <math.h>
int n = 4, m = 4;
int a[4][4] = { {3, 1, 0, 7}, {2, 5, 10, 3}, {3, 7, 4, 1}, {10, 2, 0, 3} };
int min_val = 1000000000, max_val = -1000000000;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (a[i][j] > max_val) {
max_val = a[i][j];
}
if (a[i][j] < min_val) {
min_val = a[i][j];
}
}
}
cout << "Gia tri nho nhat : " << min_val << endl;
cout << "Gia tri lon nhat : " << max_val << endl;
return 0;
}
Output :
Gia tri lon nhat : 10
Ví dụ 2 : Liệt kê các số Fibonacci trong mảng 2 chiều
#include <math.h>
long long F[100];
F[0] = 0;
F[1] = 1;
for (int i = 2; i <= 92; i++) {
F[i] = F[i - 1] + F[i - 2];
}
for (int i = 0; i <= 92; i++) {
if (n == F[i]) return true;
}
return false;
}
int main() {
int n = 4, m = 4;
int a[4][4] = { {3, 1, 0, 7}, {2, 5, 10, 3}, {3, 7, 4, 1}, {10, 2, 0, 3} };
cout << "Cac so fibonacci : \n";
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (fibo(a[i][j])) {
cout << a[i][j] << " ";
}
}
}
return 0;
}
Output :
3 1 0 2 5 3 3 1 2 0 3
2. Bài Toán Xét Hàng, Cột
Dạng bài tập này thường yêu cầu các bạn xét từng hàng hoặc từng cột của mảng 2 chiều.
Đối với bài toán xét theo hàng bạn duyệt như bình thường còn đối với bài toán duyệt theo cột thì bạn cần để vòng for ngoài duyệt theo cột và vòng for con bên trong duyệt theo hàng.
Ví dụ 1 : Tính tổng từng hàng, từng cột của mảng 2 chiều
#include <math.h>
int n = 4, m = 4;
int a[4][4] = { {3, 1, 0, 7}, {2, 5, 10, 3}, {3, 7, 4, 1}, {10, 2, 0, 3} };
//Duyệt theo hàng, i là hàng, j là cột
for (int i = 0; i < n; i++) {
int tong = 0;
for (int j = 0; j < m; j++) {
tong += a[i][j];
}
cout << "Tong hang " << i + 1 << " : " << tong << endl;
}
//Duyệt theo cột, i là cột, j là hàng
for (int i = 0; i < m; i++) {
int tong = 0;
for (int j = 0; j < n; j++) {
tong += a[j][i];
}
cout << "Tong cot " << i + 1 << " : " << tong << endl;
}
return 0;
}
Output :
Tong hang 2 : 20
Tong hang 3 : 15
Tong hang 4 : 15
Tong cot 1 : 18
Tong cot 2 : 15
Tong cot 3 : 14
Tong cot 4 : 14
Ví dụ 2 : Tìm hàng có nhiều số nguyên tố nhất
#include <math.h>
for (int i = 2; i <= sqrt(n); i++) {
if (n % i == 0) return false;
}
return n > 1;
}
int n = 4, m = 4;
int a[4][4] = { {3, 1, 0, 7}, {2, 5, 10, 3}, {3, 7, 4, 1}, {10, 2, 0, 3} };
//Duyệt theo hàng, i là hàng, j là cột
int res = 0, hang = -1;
for (int i = 0; i < n; i++) {
int dem = 0;
for (int j = 0; j < m; j++) {
if (nt(a[i][j])) {
++dem;
}
}
if (dem > res) {
res = dem; hang = i;
}
}
cout << "Hang " << hang << " co nhieu so nguyen to nhat\n";
cout << "So luong so nguyen to : " << res << endl;
return 0;
}
Output :
So luong so nguyen to : 3
Ví dụ 3 : Tìm cột có nhiều số nguyên tố nhất, nếu có nhiều cột có cùng số nguyên tố thì chọn cột có số thứ tự lớn hơn
#include <math.h>
for (int i = 2; i <= sqrt(n); i++) {
if (n % i == 0) return false;
}
return n > 1;
}
int n = 4, m = 4;
int a[4][4] = { {3, 1, 0, 7}, {2, 5, 10, 3}, {3, 7, 4, 1}, {10, 2, 0, 3} };
//Duyệt theo hàng, i là hàng, j là cột
int res = 0, cot = -1;
for (int i = 0; i < m; i++) {
int dem = 0;
for (int j = 0; j < n; j++) {
if (nt(a[j][i])) {
}
}
if (dem >= res) {
res = dem;
cot = i;
}
}
cout << "Cot " << cot << " co nhieu so nguyen to nhat\n";
cout << "So luong so nguyen to : " << res << endl;
return 0;
}
Output :
So luong so nguyen to : 3
3. Hoán Vị Hàng, Cột
Để hoán vị 2 hàng của mảng 2 chiều thì bạn duyệt qua từng cột còn để hoán vị 2 cột thì bạn lại duyệt qua từng hàng.
Ví dụ 1 : Bài toán hoán vị 2 hàng
#include <math.h>
int n = 4, m = 4;
int a[4][4] = { {3, 1, 0, 7}, {2, 5, 10, 3}, {3, 7, 4, 1}, {10, 2, 0, 3} };
int h1 = 0, h2 = 3;
for (int i = 0; i < m; i++) {
// a[h1][i] va a[h2][i]
swap(a[h1][i], a[h2][i]);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << a[i][j] << " ";
}
cout << endl;
}
return 0;
}
Output :
2 5 10 3
3 7 4 1
3 1 0 7
Ví dụ 2 : Bài toán hoán vị 2 cột
#include <math.h>
int n = 4, m = 4;
int a[4][4] = { {3, 1, 0, 7}, {2, 5, 10, 3}, {3, 7, 4, 1}, {10, 2, 0, 3} }; int c1 = 0, c2 = 3;
for (int i = 0; i < n; i++) {
// a[i][c1] va a[i][c2]
swap(a[i][c1], a[i][c2]);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << a[i][j] << " ";
}
cout << endl;
}
return 0;
}
Output :
3 5 10 2
1 7 4 3
3 2 0 10
4. Sắp Xếp Ma Trận Theo Hàng, Cột
Sắp xếp theo hàng
Sắp xếp theo hàng trên ma trận thì bạn có thể tự code một hàm sắp xếp mảng 1 chiều sau đó áp dụng với từng hàng của mảng 2 chiều.
Như mình có nhắc ở phần lý thuyết mảng 2 chiều thì mảng 2 chiều thực chất chính là 1 mảng các mảng 1 chiều, mỗi dòng trên mảng 2 chiều chính là 1 mảng 1 chiều.
Cách 1 : Sắp xếp hàng bằng hàm sort()
#include <math.h>
int n = 4, m = 4;
int a[4][4] = { {3, 1, 0, 7}, {2, 5, 10, 3}, {3, 7, 4, 1}, {10, 2, 0, 3} }; for (int i = 0; i < n; i++) {
sort(a[i], a[i] + m);
}
cout << "Mang 2 chieu sap xep theo hang : \n";
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << a[i][j] << " ";
}
cout << endl;
}
return 0;
}
Output :
0 1 3 7
2 3 5 10
1 3 4 7
0 2 3 10