Điểm cực trị trong ma trận

Tính tổng các phần tử cực trị trong ma trận. Một phần tử gọi là cực trị khi nó lớn hơn các phần tử xung quanh hoặc nhỏ hơn các phần tử xung quanh.
Em đang bí ở chỗ kiểm tra a[i][j] là điểm cực trị, nếu a[i][j] là điểm cực trị thì tong += a[i][j]. Bác nào giúp em với, nêu ý tưởng hoặc code luôn cũng được.
Em xin cảm ơn.

So với 4 hay là 8 phần tử xung quanh nó?
+1-1 thôi mà.

2 Likes

đề chỉ ghi vậy thôi anh ơi! Câu 9 .

Em viết code như thế này, có thể cải tiến cho ngắn gọn hơn đc không ạ ?

#include<iostream>
#include<stdlib.h>
#include<time.h>
#define MAX 100
using namespace std;

void NhapMaTran(int a[][MAX], int& m, int& n)
{
	cout << "\n============= MA TRAN NGAU NHIEN =============\n";
	cout << "Nhap so dong : "; cin >> m;
	cout << "Nhap so cot : "; cin >> n;
	srand(time(NULL));
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
			a[i][j] = rand() % 50 - 25;
	}
}

void XuatMaTran(int a[][MAX], int m, int n)
{
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cout << a[i][j] << "\t";
		}
		cout << endl;
	}
}
/* ý tưởng : xét 4 điểm tại 4 góc, rồi xét đến 4 đường biên bao xung quanh ma trận, cuối cùng là các điểm nằm bên trong */
bool TimCucTri(int a[][MAX], int m, int n, int i, int j)
{
	// xét tại điểm a[0][0]
	if (i == 0 & j == 0) 
	{
		if ((a[i][j] > a[i][j+1] && a[i][j] > a[i+1][j])|| (a[i][j] < a[i][j+1] && a[i][j] < a[i+1][j]))
			return true;
	}
	
	// xét tại điểm a[m-1][0]
	if (i == m - 1 && j == 0)
	{
		if ((a[i][j] > a[i-1][j] && a[i][j] > a[i][j+1]) || (a[i][j] < a[i-1][j] && a[i][j] < a[i][j+1]))
			return true;
	}
	
	// xét tại điểm a[0][n-1]
	if (i == 0 && j == n - 1)
	{		
		if ((a[i][j] > a[i+1][j] && a[i][j] > a[i][j-1]) || (a[i][j] < a[i+1][j] && a[i][j] < a[i][j-1]))
			return true;
	}
	
	// xét tại điểm a[m-1][n-1]
	if (i == m - 1 && j == n - 1)
	{		
		if ((a[i][j] > a[i-1][j] && a[i][j] > a[i][j-1]) || (a[i][j] < a[i-1][j] && a[i][j] < a[i][j-1]))
			return true;
	}
		
	// xét tại dòng đầu tiên
	if (i == 0)
	{
		if ((a[i][j] > a[i][j+1] && a[i][j] > a[i][j-1] && a[i][j] > a[i+1][j]) || (a[i][j] < a[i][j+1] && a[i][j] < a[i][j-1] && a[i][j] < a[i+1][j]))
			return true;
	}
	
	// xét tại cột đầu tiên
	if (j == 0)
	{
		if ((a[i][j] > a[i][j+1] && a[i][j] > a[i + 1][j] && a[i][j] > a[i-1][j]) || (a[i][j] < a[i][j+1] && a[i][j] < a[i+1][j] && a[i][j] < a[i-1][j]))
			return true;
	}
	
	// xét tại dòng cuối cùng
	if (i == m - 1)
	{
		if ((a[i][j] > a[i][j+1] && a[i][j] > a[i][j-1] && a[i][j] > a[i-1][j]) || (a[i][j] < a[i][j+1] && a[i][j] < a[i][j-1] && a[i][j] < a[i-1][j]))
			return true;
	}
	
	// xét tại cột cuối cùng
	if (j == n - 1)
		if ((a[i][j] > a[i-1][j] && a[i][j] > a[i][j-1] && a[i][j] > a[i+1][j]) || (a[i][j] < a[i-1][j] && a[i][j] < a[i][j-1] && a[i][j] < a[i+1][j]))
			return true;

	// xét tại các điểm còn lại
	if ((a[i][j] > a[i][j+1] && a[i][j] > a[i+1][j] && a[i][j] > a[i][j-1] && a[i][j] > a[i-1][j]) || (a[i][j] < a[i][j+1] && a[i][j] < a[i+1][j]) && a[i][j] < a[i][j-1] && a[i][j] < a[i-1][j])
			return true;
	return false;
}

void XuatCucTri(int a[][MAX], int m, int n)
{
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (TimCucTri(a,m,n,i,j)) cout << a[i][j] << "\t";
		}
	}
}

int main()
{
	int a[MAX][MAX], m, n;
	NhapMaTran(a,m,n);
	cout << "\nMa tran sau khi nhap la : \n";
	XuatMaTran(a,m,n);
	cout << endl;
	XuatCucTri(a,m,n);
	
	
	
	
	system("pause");
	return 0;
}
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?