0965303260
TP. Hồ Chí Minh

[C]. Ma Trận Xoắn Ốc

Trong bài viết này mình sẽ hướng dẫn các bạn cách xây dựng ma trận xoáy ốc

NỘI DUNG : 

  • Ma Trận Xoắn Ốc 
  • Ma Trận Xoắn Ốc Nguyên Tố
  • Ma Trận Xoắn Ốc Fibonacci
  • Video Tutorial 

spiral matrix

1. Ma Trận Xoắn Ốc

Ma trận xoáy ốc (Spiral matrix) là một ma trận vuông có N dòng và N cột, các số trong ma trận được sắp xếp như một xoáy ốc gồm các số từ 1 tới N2.

Ma trận xoáy ốc cũng có thể là một ma trận không vuông có N dòng và M cột, các số trong ma trận được đánh số từ 1 tới N * M theo hình xoáy ốc

Ví dụ dưới đây là một ma trận xoáy ốc cỡ 5

ma trận xoáy ốc

Để xây dựng ma trận xoáy ốc thì ta tiến hành xây dựng từng vòng của xoáy ốc gồm 4 cạnh và lưu vào một mảng 2 chiều cỡ N x N 

Ta duy trì 4 biến số : 

  1. h1 : hàng trên của xoáy ốc
  2. h2 : hàng dưới của xoáy ốc
  3. c1 : cột trái của xoáy ốc
  4. c2 : cột phải của xoáy ốc 

Ví dụ khi bạn xây dựng xoáy ốc ngoài cùng này thì h1, h2, c1, c2 sẽ có giá trị như sau : 

ma trận xoáy ốc

Sau khi xây dựng xong vòng xoáy ốc ngoài cùng, ta sẽ tăng h1, giảm h2, tăng c1, giảm c2 để xây dựng vòng xoáy ốc tiếp theo

ma trận xoáy ốc

Code : 

#include "stdio.h"

int main(){
    int n = 5;
    int a[n][n];
    int h1 = 0, h2 = n - 1, c1 = 0, c2 = n - 1;
    int dem = 1;
    while(h1 <= h2 && c1 <= c2){
        //Xây dựng cạnh trên : hàng h1 từ cột c1 => cột c2
        for(int i = c1; i <= c2; i++){
            a[h1][i] = dem; ++dem;
        }
        //Tăng h1 để xây dựng cạnh bên phải, cột c2 từ hàng h1 tới hàng h2
        ++h1;
        for(int i = h1; i <= h2; i++){
            a[i][c2] = dem; ++dem;
        }
        //giảm c2 để xây dựng cạnh dưới, hàng h2 từ c2 => cột c1
        --c2;
        for(int i = c2; i >= c1; i--){
            a[h2][i] = dem; ++dem;
        }
        //giảm h2 để xây dựng cạnh bên phải, cột c1 từ hàng h2 tới hàng h1
        --h2;
        for(int i = h2; i >= h1; i--){
            a[i][c1] = dem; ++dem;
        }
        //tăng c1
        ++c1;
    }
    printf("Ma tran xoay oc co %d : \n", n);
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

Output : 

Ma tran xoay oc co 5 : 
1 2 3 4 5 
16 17 18 19 6 
15 24 25 20 7 
14 23 22 21 8 
13 12 11 10 9 


2. Ma Trận Xoắn Ốc Nguyên Tố

Ma trận xoáy ốc nguyên tố là ma trận xoáy ốc nhưng các số xuất hiện trong ma trận sẽ là các số nguyên tố từ nhỏ tới lớn. 

Ví dụ ma trận xoáy ốc cỡ 5 thì bạn cần 25 số nguyên tố đầu tiên

Cách xây dựng ma trận xoáy ốc nguyên tố tương tự xây dựng ma trận xoáy ốc thường, ta cần chuẩn bị trước 1 số lượng số nguyên tố vừa đủ với số lượng phần tử trong ma trận xoáy ốc và gán lần lượt.

xoáy ốc nguyên tố

Code : 

#include "stdio.h"
#include "math.h"

int prime(int n){
    if(n < 2) return 0;
    for(int i = 2; i <= sqrt(n); i++){
        if(n % i == 0) return 0;
    }
    return 1;
}

int main(){
    int n = 5;
    int a[n][n];
    int X[10000], idx = 0, i = 0;
    while(idx < n * n){
        if(prime(i)){
            X[idx] = i; ++idx;
        }
        ++i;
    }
    int h1 = 0, h2 = n - 1, c1 = 0, c2 = n - 1;
    int dem = 0;
    while(h1 <= h2 && c1 <= c2){
        for(int i = c1; i <= c2; i++){
            a[h1][i] = X[dem]; ++dem;
        }
        ++h1;
        for(int i = h1; i <= h2; i++){
            a[i][c2] = X[dem]; ++dem;
        }
        --c2;
        for(int i = c2; i >= c1; i--){
            a[h2][i] = X[dem]; ++dem;
        }
        --h2;
        for(int i = h2; i >= h1; i--){
            a[i][c1] = X[dem]; ++dem;
        }
        ++c1;
    }
    printf("Ma tran xoay oc nguyen to co %d : \n", n);
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

Output : 

Ma tran xoay oc nguyen to co 5 : 
2 3 5 7 11 
53 59 61 67 13 
47 89 97 71 17 
43 83 79 73 19 
41 37 31 29 23 


3. Ma Trận Xoắn Ốc Fibonacci

Ma trận xoáy ốc Fibonacci chứa các số lần lượt là các số trong dãy Fibonacci, bạn tiến hành xây dựng trước mảng các số Fibo và gán lần lượt cho ma trận xoáy ốc

Thông thường cỡ ma trận xoáy ốc Fibonacci không quá 9

Nếu bạn chưa biết dãy Fibonacci có thể tham khảo tại đây

xoáy ốc fibonacci

Code : 

#include "stdio.h"
#include "math.h"

int main(){
    int n = 4;
    long long a[n][n];
    long long F[100];
    F[0] = 0; F[1] = 1;
    for(int i = 2; i < n * n; i++){
        F[i] = F[i - 1] + F[i - 2];
    }
    int h1 = 0, h2 = n - 1, c1 = 0, c2 = n - 1;
    int dem = 0;
    while(h1 <= h2 && c1 <= c2){
        for(int i = c1; i <= c2; i++){
            a[h1][i] = F[dem]; ++dem;
        }
        ++h1;
        for(int i = h1; i <= h2; i++){
            a[i][c2] = F[dem]; ++dem;
        }
        --c2;
        for(int i = c2; i >= c1; i--){
            a[h2][i] = F[dem]; ++dem;
        }
        --h2;
        for(int i = h2; i >= h1; i--){
            a[i][c1] = F[dem]; ++dem;
        }
        ++c1;
    }
    printf("Ma tran xoay oc Fibonacci co %d : \n", n);
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

Output : 

Ma tran xoay oc Fibonacci co 4 : 
0 1 1 2 
89 144 233 3 
55 610 377 5 
34 21 13 8 


Xem thêm video bài giảng của mình về ma trận Xoắn Ốc :

3YIz7h0EZME