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.
Điểm cực trị trong ma trận
So với 4 hay là 8 phần tử xung quanh nó?
+1 và -1 thôi mà.
2 Likes
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?