Tạo ma trận vuông với các điều kiện

ĐIỀU KIỆN CỦA MA TRẬN ĐÂY Ạ


Còn đây là code của e(em hơi bí cái đoạn kiểm tra từng hàng xem có số nào khác 0 ko rồi mới sang cột khác đó ạ, code của e là chỉ kiểm tra số đầu tiên của cột th ạ)

#
void NhapMaTran(double a[][100],int& m,int& n){
    cin>>m;
    cin>>n;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cin>>a[i][j];
        }
    }
}bool isMaTranDonVi(double a[][100],int& n,int& m){
    for(int i=0;i<n;i++){
        if(a[i][i]!=1) return false;
    }
    return true;
}

bool cot(double a[][100],int& m,int& n){
    int dem=0,j=0,i=0;
    while(i<m){
        while(j<i){
            if(a[i][j]!=0) dem++;
            j++;
        }i++;
        j=0;
    }if(dem>(1)) return false;
    return true;
}
int main(){
    int n,m;
    double  a[100][100];
	NhapMaTran(a,n,m);
    if(isMaTranDonVi(a,m,n) && cot(a,m,n)) cout<<"Yes";
    else cout<<"No";
	return 0;
}
  • Tổng số phần tử ma trận là m * n.
  • Đường chéo chính tất cả bằng 1 => có x (x sẽ là giá trị nhỏ hơn của m, n) phần tử khác 0.
  • Tối đa 1 phần tử dưới đường chéo chính khác có giá trị bất kì => 1 hoặc 0 phần tử khác 0.

=> Tổng số 0 trong mảng để đảm bảo yêu cầu thứ 3 bằng (m * n - (x + 1)) hoặc bằng m * m - (x + 0) và đảm bảo phần phía trên đường chéo chính tất cả đều là 0.
Cả 3 hàm cho 3 yêu đều true thì ma trận đúng theo yêu cầu.

Mình nghĩa 3 yêu cầu này cùng xét trong 1 lần (1 hàm) thì ổn hơn.

1 Like
int arr[20][20], cnt = 0;
bool satisfied = true;
int n;

// cnt dong vai tro dem so lan xuat hien cua day khac 0
cin >> n;

for (int i = 0; i < n; i++)
{
	for (int j = 0; j < n; j++) cin >> arr[i][j];
}

for (int j = 0; j < n; j++)
{
	if (arr[j][j] != 1) satisfied = false;
}

if (satisfied == false) cout << "NO" << endl;
else
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (j > i)
			{
				if (arr[j][i] != 0 && cnt == 0)
				{
					cnt = 1;
					break;
				}
				else if (arr[j][i] != 0 && cnt != 0)
				{
					satisfied = false; break;
				}
			}
			else if (j < i && arr[j][i] != 0) 
			{ 
				satisfied = false; 
				break; 
			}
		}

		if (satisfied == false) break;
	}

	if (satisfied == false) cout << "NO" << endl;
	else cout << "YES" << endl;
}

Mình đã thử với các input:
3
1 0 0
0 1 0
0 3 1 (YES)

3
1 0 0
0 1 0
1 3 1 (NO)

4
1 0 0 0
0 1 0 0
0 3 1 0
0 4 0 1 (YES)

4
1 0 0 0
0 1 0 0
0 3 1 0
0 4 1 1 (NO)

4
1 0 0 0
0 4 0 0
0 3 1 0
0 4 1 2 (NO)

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