Bài toán hoán vị ma trận thưa

Bài số 3 ạ. mình làm chạy k lỗi nhưng k ra output mn check giúp với ! cảm ơn ạ

#include  <iostream>
#include  <algorithm> 

using namespace std;

void NhapMaTran(int **a, int dong, int cot,int dem)// ham nhap ma tran vao va dem xem co bao nhieu phan tu khac 0 luu vao bien "dem"
{
	
	for(int i=0;i<dong;i++){
		for(int j=0;j<cot;j++){
			cout<<"Nhap phan tu hang:"<<i+1<<" cot:"<<j+1<<" : ";
			cin>>a[i][j];
			if(a[i][j]!=0){
			dem++;
			}
		}
	}	
}

void Taomanghaichieu(int **a,int dong, int cot, int **b,int dem)//Nhap mang 2 chieuluu thong tin cac phantu khac 0 cua ma tran ban dau
{ 
	int sopt=1;
	b[0][0]=dong;
	b[0][1]=cot;
	b[0][2]=dem;
	for(int i=0;i<dong;i++){
		for(int j=0;j<cot;j++){
			if(a[i][j]!=0){
				b[sopt][2]=a[i][j];
				b[sopt][1]=j;
				b[sopt][0]=i;
				sopt++;
			}
		}
	}
}

void Hoanvi(int **b,int dem)// Hoan vi ma tran va thay doi chi so mang
{
	int tg=0;
	for(int i=1;i<=dem;i++){
		tg=b[i][0];
		b[i][0]=b[i][1];
		b[i][1]=tg;	
	}
}

void Sapxep(int **b,int dem)//sap xep mang theo thu tu tang dan = pp NOI BOT!
{	
	int tg=0;
	for (int i = 0; i < dem-1; i++){
        for (int j = 0; j < dem-i-1; j++){
            if (b[j][0] > b[j+1][0]){
                swap(b[j][2],b[j+1][2]);
                swap(b[j][1],b[j+1][1]);
                swap(b[j][0],b[j+1][0]);
            }
        }
	}
}
void Inmang(int **b,int dong, int cot)
{cout<<endl;
	for(int i=0;i<dong;i++){
		for(int j=0;j<cot;j++){
			cout<<" "<<b[i][j];
		}
		cout<<endl;
	}
}

int main(){
	int hang,cot,**a=NULL, **b=NULL,dem=0;
	cout<<"Nhap so hang: ";cin>>hang;cout<<endl;
	cout<<"Nhap so cot: ";cin>>cot;cout<<endl;
	
	a = (int **)malloc(hang * sizeof(int *));
    for (int i = 0; i < hang; i++)//con tro ma tran ban dau
    {
       
        a[i] = (int *)malloc(cot * sizeof(int));
    }
    
	NhapMaTran(a,hang,cot,dem);
	
	b = (int **)malloc(dem * sizeof(int *));//con tro mang 2 chieu
    for (int i = 0; i < dem; i++)
    {
       
        a[i] = (int *)malloc(2 * sizeof(int));
    }
    
	Taomanghaichieu(a,hang,cot,b,dem);
	cout<<"Ma tran hien tai: "<<endl;
	Inmang(b,dem,2);
	
	Hoanvi(b,dem);
	cout<<"Ma tran sau khi hoan vi: "<<endl;

	Sapxep(b,dem);
	cout<<"Ma tran sau khi sap xep: "<<endl;
	Inmang(b,dem,2);
	
	return 0;
}

Mình nhìn thấy ngay 2 vấn đề sau đây:

  • Đề có yêu cầu rõ số cột (column) là 3, nên bạn không cần phải nhập.
  • Tồng số hàng (row) là số phần tử khác 0 cộng thêm 1.

Phần thuật toán mình chưa đọc, bạn thử fix lại xem còn lỗi không.

2 Likes

em chưa hiểu lắm em có nhập colmn đâu anh chỉ giúp đoạn nào với, em chỉ nhập cột hàng ma trận thưa thôi (Am*n)

Đúng ra gọi là chuyển vị ma trận.

Luồng chạy của bạn là:

  • Nhập ma trận đầy đủ (!) (chắc là nhắc chỗ này)
  • Chuyển ma trận đầy đủ về dạng bảng
  • Tráo đổi dòng và cột
  • Sắp xếp

Lỗi nằm ở đây

a[i] = (int *)malloc(2 * sizeof(int));

Dòng, cột và dữ liệu mà chỉ có 2 ô int?

3 Likes

hiểu rồi ạ, e chưa hiểu đưa mảng vào hàm nên nghĩ 2 là 0 1 2

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?