Cần sự góp ý về bài tập in ma trận trong C
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;
}
2 CÂU TRẢ LỜI
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;
}
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
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 đỡ ạ
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:
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