Bài tập cơ bản về mảng 2 chiều

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 ô, đem chia 2 lấy dư, sẽ nhận được giá trị 0 hoặc 1 để gán cho ô đó.

Tam giác Pascal

Ứng với mỗi hàng trong tam giác Pascal, phần tử đầu tiên và phần tử cuối cùng đều là 1. Với các phần tử ở giữa, mỗi phần tử là tổng của hai phần tử nằm ở cùng cột và ở cột liền trước thuộc hàng liền bên trên. a[r][c] = a[r – 1][c] + a[r – 1][c – 1]

Ma trận zigzag

Duyệt từng hàng:

— Đối với hàng chẵn 0, 2, 4, etc, thì điền số tăng dần vào các ô từ trái sang phải.

— Đối với hàng lẻ 1, 3, 5, etc, thì điền số tăng dần vào các ô từ phải sang trái.

Ma trận xoắn ốc

Dùng vòng lặp while, lần lượt điền số vào 4 cạnh biên của từng ma trận con (là ma trận nhỏ hơn vì bị xoắn ốc), cho đến khi số được điền vào có giá trị bằng với kích thước của ma trận gốc:

Mảng là một cấu trúc dữ liệu cơ bản và được sử dụng rất nhiều trong các bài toán lập trình. Mảng đa chiều là một cấu trúc dữ liệu mảng có nhiều vai trò quan trọng. Với mảng đa chiều, chúng ta thường chỉ sử dụng đến mảng 2 chiều(ma trận) và đôi khi sử dụng mảng 3 chiều. Bài viết này xin chia sẻ tới các bạn kiến thức về mảng đa chiều.

Sau bài học này, bạn hãy chuyển ngay tới bài viết “Bài tập mảng 2 chiều có đáp án chi tiết” để luyện tập kiến thức vừa học nhé.

NỘI DUNG BÀI VIẾT

1. Lý thuyết về mảng đa chiều

Mảng đa chiều(TA: multi-dimensional array) là một mảng của các mảng. Mảng 2 chiều hay ma trận là mảng đa chiều thường được sử dụng nhất; Khi đó, mảng 2 chiều là một mảng của các mảng 1 chiều. Mảng 2 chiều có cách lưu trữ các phần tử giống như một bảng.

Bài tập cơ bản về mảng 2 chiều
Một mô phỏng về mảng 2 chiều có kích thước 3 x 5

Sau đây, bài hướng dẫn sẽ chỉ trình bày về ma trận(mảng 2 chiều). Tôi xin lưu ý, mảng 2 chiều còn được gọi với tên khác là ma trận.

Cách truy cập tới phần tử của ma trận cũng giống như với mảng 1 chiều. Tuy nhiên, chúng ta sẽ có 2 chỉ số khác nhau là chỉ số hàng và chỉ số cột. Cú pháp như sau: arr[row_index][col_index].

2. Khai báo mảng 2 chiều

Để khai báo mảng 2 chiều, bạn phải chỉ định các tham số sau:

  • row-size: Khai báo số hàng của mảng 2 chiều
  • column-size: Khai báo số cột của mảng 2 chiều
  • Type of array: Kiểu dữ liệu của mảng 2 chiều. Việc này chỉ định kiểu dữ liệu của các phần tử trong mảng; là số nguyên, số thực, ký tự hay là kiểu dữ liệu nào đó

Cú pháp khai báo mảng 2 chiều có dạng:

type arr[row_size][column_size]

Một ví dụ khai báo mảng 2 chiều trong C/C++:

int arr[3][5];

3. Khởi tạo mảng 2 chiều

Giống như mảng 1 chiều, mảng 2 chiều cũng có thể khởi tạo trong quá trình khai báo hoặc khởi tạo sau khi khai báo.

Cú pháp khởi tạo mảng 2 chiều trong khi khai báo như sau:

type arr[row_size][column_size] = {{elements}, {elements} ... }

Đây là một ví dụ khai báo và khởi tạo mảng cùng lúc trong C/C++:

int arr[3][5] = {{5, 12, 17, 9, 3}, {13, 4, 8, 14, 1}, {9, 6, 3, 7, 21}};

Với cách khởi tạo mảng 2 chiều sau khi khai báo, sử dụng chỉ số để truy cập tới từng ô của mảng, chúng ta có cú pháp như sau:

type arr[row_size][column_size] arr[i][j] = 14

Một ví dụ trên ngôn ngữ C/C++ với việc khởi tạo mảng 2 chiều sau khi khai báo:

int arr[3][5]; arr[0][0] = 5; arr[1][3] = 14;

Việc khai báo như thế này khá là ngây thơ và ít được sử dụng. Thay vào đó, chúng ta thường khởi tạo giá trị cho mảng 2 chiều bằng việc đọc từ stdin; Bạn có thể thấy ở phần nhập mảng 2 chiều trong mục tiếp theo.

4. Các thao tác với mảng 2 chiều

Một thao tác đơn giản nhất và hay sử dụng nhất đó là việc lặp qua tất cả các phần tử của mảng 2 chiều theo cách sau:

type arr[row_size][column_size] = {{elements}, {elements} ... } for i from 0 to row_size

for j from 0 to column_size  
    print arr[i][j]
Đây là một ví dụ cho việc lặp qua tất cả các phần tử trong mảng và in nó ra trên ngôn ngữ C/C++:

include

int main() {

// Array declaration and initialization  
int arr[3][5] = {{5, 12, 17, 9, 3}, {13, 4, 8, 14, 1}, {9, 6, 3, 7, 21}};  
// Iterate over the array  
for(int i=0; i<3; i++)  
{  
    for(int j=0; j<5; j++)  
    {  
        // Print out each element  
        printf("%5d", arr[i][j]);  
    }  
    // Print new line character after the row is printed in above loop  
    printf("\n");  
}  
return 0;  
}

Ngay bây giờ, chúng ta sẽ đi vào việc viết các hàm xử lý các thao tác cơ bản nhất trên mảng 2 chiều.

4.1. Thao tác nhập mảng 2 chiều

Hàm NhapMaTran nhận vào các đối số là mảng 2 chiều a, số hàng m, số cột n. Hàm này không trả về giá trị nên có kiểu là void.

void NhapMaTran(int a[][100], int m, int n) { for(int i = 0; i < m; i++)

  for(int j = 0; j < n; j++)  
  {  
     printf("A[%d][%d] = ", i, j);  
     scanf("%d", &a[i][j]);  
  }  
}

Câu hỏi: Tại sao phải chỉ định kích thước cột của ma trận trong tham số hàm: a[][100] ?

Xem câu trả lời cho câu hỏi trên tại đây.

4.2. Thao tác xuất mảng 2 chiều

Hàm này tương đối giống với hàm NhapMaTran phía trên. Do vậy, mình không trình bày lại nữa.

void XuatMaTran(int a[][100], int m, int n) { for(int i = 0; i < m; i++) {

  for(int j = 0; j < n; j++)  
     printf("%d\t", a[i][j]);  
  printf("\n");  
} }

Sau mỗi hàng chúng ta in thêm “\n” để kết quả in ra được dạng bảng.

4.3. Tìm kiếm trong mảng 2 chiều

Hàm này sẽ trả về một cặp gồm {chỉ số hàng, chỉ số cột} nên mình để kiểu trả về là

int arr[3][5];

2. Ngoài các tham số giống như 2 hàm nhập & xuất, nó còn nhận thêm giá trị cần tìm kiếm

int arr[3][5];

3.

Chú ý: pair có trong thư viện

int arr[3][5];

4. Nếu tìm thấy, trả về vị trí đầu tiên tìm được, ngược lại trả về {-1, -1}.

int arr[3][5];

0

Full source code cho các chức năng trên và lời gọi hàm trong hàm main:

int arr[3][5];

1

5. Bài tập thực hành

Cho một mảng 2 chiều. Nhiệm vụ của bạn là đổi tất cả các hàng thành cột, tất cả các cột thành hàng(Nó chính là bài toán chuyển vị ma trận).

Input:

  • Dòng đầu tiên là 2 số N – số hàng và M – số cột của ma trận.
  • N dòng tiếp theo, mỗi dòng có M số nguyên phân tách bởi dấu cách.

Ouput:

  • In ra M dòng, mỗi dòng gồm N số nguyên

Ràng buộc:

  • 1 <= N, M <= 10
  • 0 <= A[i][j] <= 100, với 0 <= i < N, 0 <= j < M SAMPLE INPUT SAMPLE OUTPUT 3 5 13 4 8 14 1 9 6 3 7 21 5 12 17 9 3 13 9 5 4 6 12 8 3 17 14 7 9 1 21 3

Lưu ý: Các bạn nộp bài tập xuống mục bình luận của bài học. Admin sẽ chữa bài và đánh giá lời giải giúp các bạn.