I. Mảng hai chiều trong C++ là gì?
1. Khai báo và truy xuất
Trong C++, ta có thể sử dụng kiểu dữ liệu mảng từ hai chiều trở lên. Mảng hai chiều là một ví dụ rất trực quan và dễ tưởng tượng, nó có thể được xem như một bảng hình chữ nhật với M hàng và N cột.
Cú pháp khai báo rất đơn giản:
Khi đó, tổng số phần tử của mảng sẽ là {Số_hàng} × {Số_cột}. Ví dụ, nếu ta khai báo một mảng hai chiều gồm 10 hàng và 12 cột chứa các số nguyên, ta viết như sau:
Các hàng và cột của mảng hai chiều thường được đánh số từ 0. Để truy cập một phần tử trong mảng hai chiều, chúng ta sử dụng toán tử []
ở mỗi chiều để chỉ định hàng và cột của phần tử đó. Ví dụ, để truy cập phần tử ở hàng 3, cột 4, ta chỉ cần viết:
Để thuận tiện cho việc đánh số và biểu diễn trên hình, thường người ta quy ước đánh số các hàng từ trên xuống dưới và các cột từ trái qua phải.
Có một lưu ý nhỏ khi khai báo mảng hai chiều là không nên khai báo bằng biến cục bộ. Lý do là khi khai báo biến cục bộ, bộ nhớ cấp phát cho biến đó sẽ được lưu trữ trong ngăn xếp (stack) của máy tính. Một số trình biên dịch có thể gây ra lỗi không mong muốn khi khai báo mảng hai chiều lớn bằng biến cục bộ.
2. Khởi tạo mảng hai chiều
Giống như mảng một chiều, mảng hai chiều cũng có thể khởi tạo trước giá trị. Cú pháp như sau:
Ví dụ: Khởi tạo mảng hai chiều kích thước 3×4 gồm 12 số nguyên:
Ngoài việc sử dụng cách khởi tạo mảng với số phần tử cố định, ta cũng có thể khởi tạo mảng hai chiều mà không cần xác định số hàng và cột trước, hoặc không cần khởi tạo tất cả các phần tử như mảng một chiều. Bạn có thể tự thử nghiệm các phương pháp khởi tạo khác nhau để kiểm tra. Trong ngôn ngữ C++, không chỉ có mảng hai chiều mà còn có mảng nhiều chiều, tuy nhiên việc tưởng tượng và sử dụng mảng nhiều chiều sẽ khá phức tạp, do đó chúng ta không cần đề cập đến chúng ở đây.
3. Nhập xuất dữ liệu trên mảng hai chiều
Dưới đây là một ví dụ minh họa cho một chương trình yêu cầu người dùng nhập vào một mảng hai chiều có kích thước M×N và sau đó in ra mảng đó theo thứ tự hàng cột. Bạn có thể áp dụng phương pháp tương tự cho việc nhập và truy xuất dữ liệu trên các mảng 3x3, 4x4, và những mảng có nhiều chiều hơn:
Giả sử nhập vào mảng kích thước 3×4 với các giá trị từ 1 tới 12, chạy chương trình sẽ thu được kết quả sau:
II. Một số bài toán với mảng hai chiều
1. Tìm giá trị lớn nhất trong mảng hai chiều
Đề bài
Cho mảng hai chiều A gồm m hàng n cột, các hàng được đánh số từ 1 tới m từ trên xuống dưới, các cột được đánh số từ 1 tới n từ trái qua phải. Ô nằm trên giao của hàng i, cột j gọi là ô (i,j) và có chứa số nguyên ai,j.
Hãy xác định giá trị lớn nhất trong mảng A?
Input:
- Dòng đầu tiên chứa hai số nguyên dương m,n - kích thước mảng hai chiều (1≤m,n≤1000).
- m dòng tiếp theo, mỗi dòng chứa n số nguyên ai,j thể hiện hàng thứ i của mảng (ai,j≤109).
Output:
- In ra giá trị lớn nhất trong mảng A.
Sample Input:
Sample Output:
Ý tưởng
Để giải quyết bài toán này, chúng ta có thể sử dụng kỹ thuật đặt cờ và gán một biến res = a[1][1]
để coi như phần tử lớn nhất trong mảng là a[1][1]
. Sau đó, chúng ta duyệt qua tất cả các giá trị trong bảng. Nếu phần tử nào lớn hơn res
, chúng ta cập nhật lại res
bằng phần tử đó.
Kết quả cuối cùng sẽ là res
.
Cài đặt
2. Tính tổng các phần tử trong mảng
Đề bài
Cho mảng hai chiều A gồm m hàng n cột, các hàng được đánh số từ 1 tới m từ trên xuống dưới, các cột được đánh số từ 1 tới n từ trái qua phải. Ô nằm trên giao của hàng i, cột j gọi là ô (i,j) và có chứa số nguyên ai,j.
Hãy tính tổng các phần tử trong mảng?
Input:
- Dòng đầu tiên chứa hai số nguyên dương m,n - kích thước mảng hai chiều (1≤m,n≤1000).
- m dòng tiếp theo, mỗi dòng chứa n số nguyên ai,j thể hiện hàng thứ i của mảng (ai,j≤109).
Output:
- Số nguyên duy nhất là tổng các phần tử trong mảng.
Sample Input:
Sample Output:
Ý tưởng
Tương tự như mảng một chiều, chúng ta có thể sử dụng một biến sum
để lưu tổng các phần tử trong mảng. Sau đó, chúng ta duyệt qua toàn bộ các phần tử và tính tổng của chúng.