Đếm phần tử yên ngựa trong ma trận

Các bác cho em hỏi code như này có sai sót hay chưa tối ưu ở chỗ nào không?
Bài này em làm theo định nghĩa: " Phần tử yên ngựa là phần tử lớn nhất trên dòng và nhỏ nhất trên cột mà nó đi qua." Mà tìm hiểu trên mạng thì định nghĩa này bị ngược.
*Vậy đinh nghĩa chính xác về phần tử yên ngựa là ntn?

  • Chỉ nói lớn nhất/ nhỏ nhất thì có tính trường hợp có phần tử bằng nó không?
    Cảm ơn mn đã xem!!!
int KTPTYenNgua(int a[][MAX], int m, int n, int i, int j)
{
	int flag = 1;
	//Duyet dong
	for (int cot = 0; cot < j; cot++)
	if (a[i][cot] >= a[i][j])
	{
		flag = 0;
		break;
	}
	for (int cot = j+1; cot < n; cot++)
	if (a[i][cot] >= a[i][j])
	{
		flag = 0;
		break;
	}
	//Duyet cot
	for (int dong = 0; dong < i; dong++)
	if (a[dong][j] <= a[i][j])
	{
		flag = 0;
		break;
	}
	for (int dong = i + 1; dong < m; dong++)
	if (a[dong][j] <= a[i][j])
	{
		flag = 0;
		break;
	}
	return flag;
}
int DemPTYenNgua(int a[][MAX], int m, int n)
{
	int dem = 0;
	for (int i = 0; i < m; i++)
	for (int j = 0; j < n; j++)
	if (KTPTYenNgua(a, m, n, i, j) == 1)
	{
		dem++;
		cout <<"a["<<i<<"]["<<j<<"]= "<< a[i][j] << "\t";
	}
	return dem;
}

Thay vì dùng biến flagbreak thì bạn return 0; luôn; cuối hàm thì return 1; là xong.
Không nhất thiết nhiều vòng lặp thế. 2 vòng, 1 cho dòng, 1 cho cột. Trong mỗi vòng lặp, chỉ cần loại trừ giá trị cần tìm bằng điều kiện if, như: if(cot == j) continue;

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