Bài tập

Các Dạng Bài Tập Mảng 2 Chiều

Huy Erick

Liệt Kê và Đếm Các Phần Tử Thỏa Mãn Tính Chất Dạng bài tập 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...

Liệt Kê và Đếm Các Phần Tử Thỏa Mãn Tính Chất

Dạng bài tập 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... Để làm được dạng bài tập này, bạn chỉ cần biết duyệt mảng 2 chiều.

Ví dụ 1: Tìm phần tử nhỏ nhất và lớn nhất trong mảng 2 chiều

#include "stdio.h"  #include "math.h"   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}      };      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];              }          }      }       printf("Giá trị nhỏ nhất: %d\n", min_val);      printf("Giá trị lớn nhất: %d\n", max_val);       return 0;  }

Kết quả:

Giá trị nhỏ nhất: 0 Giá trị lớn nhất: 10

Ví dụ 2: Liệt kê các số Fibonacci trong mảng 2 chiều

#include "stdio.h"  #include "math.h"   int fibo(long long n){      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 1;      }       return 0;  }  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}      };       printf("Các số Fibonacci: ");       for(int i = 0; i < n; i++){          for(int j = 0; j < m; j++){              if(fibo(a[i][j])){                  printf("%d ", a[i][j]);              }          }      }       return 0;  }

Kết quả:

Các số Fibonacci: 3 1 0 2 5 3 3 1 2 0 3

Xét Theo Hàng và Cột

Dạng bài tập này thường yêu cầu 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 mảng theo cách thông thường. Còn đối với bài toán xét theo cột, bạn cần sử dụng 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 "stdio.h"  #include "math.h"   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}      };       // 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];          }          printf("Tổng hàng %d: %d\n", i, tong);      }       // 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];          }          printf("Tổng cột %d: %d\n", i, tong);      }       return 0;  }

Kết quả:

Tổng hàng 0: 11 Tổng hàng 1: 20 Tổng hàng 2: 15 Tổng hàng 3: 15 Tổng cột 0: 18 Tổng cột 1: 15 Tổng cột 2: 14 Tổng cột 3: 14

Ví dụ 2: Tìm hàng có nhiều số nguyên tố nhất

#include "stdio.h"  #include "math.h"   int prime(int n){      for(int i = 2; i <= sqrt(n); i++){          if(n % i == 0)              return false;      }       return n > 1;  }  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}      };       // 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(prime(a[i][j])){                  ++dem;              }          }          if(dem > res){              res = dem;              hang = i;          }      }       printf("Hàng %d có nhiều số nguyên tố nhất\n", hang);      printf("Số lượng số nguyên tố ở hàng %d: %d\n", hang, res);       return 0;  }

Kết quả:

Hàng 1 có nhiều số nguyên tố nhất Số lượng số nguyên tố ở hàng 1: 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ố, chọn cột có số thứ tự lớn hơn

#include "stdio.h"  #include "math.h"   int prime(int n){      for(int i = 2; i <= sqrt(n); i++){          if(n % i == 0)              return false;      }       return n > 1;  }  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}      };       // 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(prime(a[j][i])){                  ++dem;              }          }          if(dem >= res){              res = dem;              cot = i;          }      }       printf("Cột %d có nhiều số nguyên tố nhất\n", cot);      printf("Số lượng số nguyên tố ở cột %d: %d\n", cot, res);       return 0;  }

Kết quả:

Cột 3 có nhiều số nguyên tố nhất Số lượng số nguyên tố ở cột 3: 3

Hoán Vị Hàng và Cột

Để hoán vị 2 hàng của mảng 2 chiều, bạn duyệt qua từng cột. Còn để hoán vị 2 cột, bạn duyệt qua từng hàng.

Ví dụ 1: Hoán vị 2 hàng

#include "stdio.h"  #include "math.h"   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}      };      int h1 = 0, h2 = 3;       for(int i = 0; i < m; i++){          int tmp = a[h1][i];          a[h1][i] = a[h2][i];          a[h2][i] = tmp;      }       for(int i = 0; i < n; i++){          for(int j = 0; j < m; j++){              printf("%d ", a[i][j]);          }          printf("\n");      }       return 0;  }

Kết quả:

10 2 0 3 2 5 10 3 3 7 4 1 3 1 0 7

Ví dụ 2: Hoán vị 2 cột

#include "stdio.h"  #include "math.h"   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}      };      int c1 = 0, c2 = 3;       for(int i = 0; i < n; i++){          int tmp = a[i][c1];          a[i][c1] = a[i][c2];          a[i][c2] = tmp;      }       for(int i = 0; i < n; i++){          for(int j = 0; j < m; j++){              printf("%d ", a[i][j]);          }          printf("\n");      }       return 0;  }

Kết quả:

7 1 0 3 3 5 10 2 1 7 4 0 3 2 0 10

Sắp Xếp Mảng Theo Hàng và Cột

Sắp xếp theo hàng

Để sắp xếp theo hàng trên mảng 2 chiều, 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.

Cách 1: Sắp xếp hàng bằng hàm qsort()

#include "stdio.h"  #include "stdlib.h"   int cmp(const void *a, const void *b){      int *x = (int*)a;      int *y = (int*)b;      return *x - *y;  }  int main(){      int n = 4, m = 5;      int a[4][5] = {          {3, 1, 0, 7, 2},          {2, 5, 10, 3, 4},          {3, 17, 4, 1, 7},          {10, 2, 0, 11, 9}      };       for(int i = 0; i < n; i++){          // Sắp xếp a[i]         qsort(a[i], m, sizeof(int), cmp);      }       printf("Mảng 2 chiều sau khi sắp xếp:\n");      for(int i = 0; i < n; i++){          for(int j = 0; j < m; j++){              printf("%d ", a[i][j]);          }          printf("\n");      }       return 0;  }

Kết quả:

Mảng 2 chiều sau khi sắp xếp: 0 1 2 3 7 2 3 4 5 10 1 3 4 7 17 0 2 3 9 11
1