Asked Nov 21st, 2018 12:58 a.m. 683 0 2
  • 683 0 2
+1

Cần sự góp ý về bài tập in ma trận trong C

Share
  • 683 0 2

Chào mọi người, em đang làm bài tập in ma trận vuông có dạng như sau:

  n = 4
 
  4  4  4  4  4  4  4
  4  3  3  3  3  3  4
  4  3  2  2  2  3  4
  4  3  2  1  2  3  4
  4  3  2  2  2  3  4
  4  3  3  3  3  3  4
  4  4  4  4  4  4  4

Cách giải thì em đã làm ra rồi nhưng em cảm thấy cách giải của em nó si đa quá 😦 Em không biết có ai chỉ em cách giải tốt hơn để in được ma trận như trên không ạ?

Code của em đây ạ:

#include <stdio.h>
#include <stdlib.h>

#define MAX 100

// Copy dòng
void copy(int mang[MAX][MAX], const int length, int from, int to)
{
    for (int i = 0; i < length; i++)
    {
        mang[to][i] = mang[from][i];
    }
}

// Tạo giá trị
void matran(int mang[MAX][MAX], const int length, const int number)
{
    // Chạy từ 0 -> đến nửa ma trận
    for (int hang = 0; hang <= length / 2; hang++)
    {
        for (int cot = hang; cot < length - hang; cot++)
        {
            if (hang >= 1 && cot <= hang)
            {
                for (int i = 0; i < cot; i++)
                {
                    mang[hang][i] = mang[hang - 1][i];
                    mang[hang][length - i - 1] = mang[hang - 1][i];
                }
            }
            mang[hang][cot] = number - hang;
        }
    }
    // Copy nửa ma trận trên sang nửa ma trận dưới
    for (int hang = (length / 2) + 1, i = length / 2 - 1; hang < length, i >= 0; ++hang, --i)
    {
        copy(mang, length, i, hang);
    }
}

void print(const int mang[MAX][MAX], const int length)
{
    for (int hang = 0; hang < length; ++hang)
    {
        for (int cot = 0; cot < length; ++cot)
        {
            printf("%3d", mang[hang][cot]);
        }
        printf("\n");
    }
}

int main()
{
    int mang[MAX][MAX];
    int number = 9;
    int length = (number * 2) - 1;

    matran(mang, length, number);

    print(mang, length);

    return 0;
}
Nov 21st, 2018 6:02 a.m.

Nếu bạn muốn một cách giải độc đáo thì bạn có thể dùng đệ quy nhé.

Cách giải của mình có thể mô tả qua các bước như sau:


3	3	3	3	3		3	3	3	3	3		0	0	0	0	0		0	0	0	0	0
3	2	2	2	3		3	0	0	0	3		0	2	2	2	0		0	0	0	0	0
3	2	1	2	3	=	3	0	0	0	3	+	0	2	0	2	0	+	0	0	1	0	0	
3	2	2	2	3		3	0	0	0	3		0	2	2	2	0		0	0	0	0	0
3	3	3	3	3		3	3	3	3	3		0	0	0	0	0		0	0	0	0	0

Trong mỗi vòng đệ quy bạn chỉ điền một số vào đúng các vị trí cần điền. Vd như số 3 điền ở các vị trí ngoài cùng. Sau đó cộng kết quả với các vòng đệ quy sau đến khi điền số 1 vào vị trí trung tâm là dừng đệ quy

+3
| Reply
Share

2 ANSWERS


Answered Nov 21st, 2018 2:37 a.m.
Accepted
+4

Bạn để ý rằng giá trị của phần tử trong mảng sẽ giảm từ biên vào giữa và trong khoảng từ n đến 1. Như vậy số lượng hàng và cột trong mảng sẽ là n * 2 - 1 . Như trong ví dụ là 4 chẳng hạn.

Xét 4 cột, 4 hàng góc bên trái ta thấy giá trị của phần tử là 4 - min(chỉ số hàng, chỉ số cột).

  4  4  4  4
  4  3  3  3
  4  3  2  2
  4  3  2  1

Xét 4 cột và 4 hàng góc trên bên phải thì ta thấy nó ngược lại một chút 4 - min(4 - chỉ số hàng, 4 - chỉ số cột)

4  4  4  4
3  3  3  4
2  2  3  4
1  2  3  4

Nếu gộp vào thì bạn tham khảo chương trình sau để hiểu hơn nhé:

void matran(int mang[MAX][MAX], const int number)
{
    int length = (number * 2) - 1;
   for (int hang = 0; hang < length; hang++)
    {
        for (int cot = 0; cot < length; cot++)
        {
            int k = i > n - 2 ? length - 1 - i : i;
            int l = j > n - 2 ? length - 1 - j : j;
            mang[hang][cot] = n - (k < l ? k : l);
        }
    }
}
int main()
{
    int mang[MAX][MAX];
    int number = 9;
    matran(mang, number);
    print(mang, length);

    return 0;
}
Share
Answered Nov 21st, 2018 2:44 a.m.
+5

Mình viết tất cả trong hàm main, mong bạn hiểu code của mình 😦

#include <iostream>

using namespace std;

int main()
{
    int n;
    cin >> n;
    
    int size = 2*n -1;
    int maxtrix[size][size];
    
// khoi tao gia tri goc tren trai    
    maxtrix[0][0] = n;
    
    for(int i = 0; i < size; i++) {
        for(int j = 0; j < size; j++) {
            if(i <= j && j < size -i) {
                maxtrix[i][j] = n - i;   
            }
            else if(i < n) {
                maxtrix[i][j] = maxtrix[i-1][j];
            }
            else {
                maxtrix[i][j] = maxtrix[size - i - 1][j];
            }
        }
    }
    
 // In ra ma tran
    for(int i = 0; i < size; i++) {
        
        for(int j = 0; j < size; j++) {
            cout << maxtrix[i][j] << ' ';
        }
        cout << '\n';
    }
    
    return 0;
}

Kết quả:

6
6 6 6 6 6 6 6 6 6 6 6
6 5 5 5 5 5 5 5 5 5 6
6 5 4 4 4 4 4 4 4 5 6
6 5 4 3 3 3 3 3 4 5 6
6 5 4 3 2 2 2 3 4 5 6
6 5 4 3 2 1 2 3 4 5 6
6 5 4 3 2 2 2 3 4 5 6
6 5 4 3 3 3 3 3 4 5 6
6 5 4 4 4 4 4 4 4 5 6
6 5 5 5 5 5 5 5 5 5 6
6 6 6 6 6 6 6 6 6 6 6
Share
Avatar Phong @zhujinfeng
Nov 21st, 2018 12:01 p.m.

Em cám ơn ạ mấy anh ạ 😭 Mặc dù em không hiểu hết cách mấy anh chỉ nhưng sẽ cố gắng để hiểu

Cám ơn mấy anh đã bỏ thời gian giúp đỡ ạ 😍

+1
| Reply
Share
Viblo
Let's register a Viblo Account to get more interesting posts.