Tìm số lượng phân tử cực trị của ma trận

#include<iostream>
using namespace std;
#include<conio.h>
#include<stdio.h>
#include<limits.h>
float nm_2c(float a[][100],int &d,int &c)
{
    cout<<"a[so dong][so cot]\n";
    cout<<"nhap so dong cua mang  ";
    cin>>d;
    cout<<"\n";
    cout<<"nhap so cot cua mang";
    cin>>c;
    for(int i=0; i<d; i++)
    {
        for(int j=0; j<c; j++)
        {
            cout<<"nhap ["<<i<<"]["<<j<<"]\t";
            cin>>a[i][j];
        }
    }
}

void xuat_mang(float a[100][100],int d,int c)
{
    for(int i=0; i<d; i++)
    {
        for(int j=0; j<c; j++)
        {
            cout<<"\t";
            printf("%6.3f",a[i][j]);
        }
        cout<<endl;
    }
}

int diemsocuctri(float a[][100],int d,int c)
{
    int diem=0;
    int Max=INT_MIN;
    int Min=INT_MAX;
    for(int i=0; i<d; i++)
    {
        for(int j=0; j<c; j++)
        {
            if(i-1>0)
            {
                Max=((a[i-1][j]>Max)?a[i-1][j]:Max);
                Min=((a[i-1][j]<Min)?a[i-1][j]:Min);
            }
            if(i+1!=d)
            {
                Max=((a[i+1][j]>Max)?a[i+1][j]:Max);
                Min=((a[i+1][j]<Min)?a[i+1][j]:Min);
            }
            if(j-1>0)
            {
                Max=((a[i][j-1]>Max)?a[i][j-1]:Max);
                Min=((a[i][j-1]<Min)?a[i][j-1]:Min);
            }
            if(j+1!=c)
            {
                Max=((a[i][j+1]>Max)?a[i][j+1]:Max);
                Min=((a[i][j+1]<Min)?a[i][j+1]:Min);
            }
            if(a[i][j]>Max||a[i][j]<Min)
            {
                printf("%.3f",a[i][j]);
                diem++;
            }
        }
    }

    return diem;
}

int main()
{
    int d,c;
    float a[100][100];

    nm_2c(a,d,c);
    xuat_mang(a,d,c);
    cout<<"ma tran co cac phan tu cuc tri la:\n";
    int tong=diemsocuctri(a,d,c);
    cout<<"so luong phan tu cuc tri la"<<tong;
}

giúp với mình làm mà hình như bị sai chổ nào á
tìm lổi sai giúp mình voi cám ơn nhiều

:slight_smile: Hình như 2 cái điều kiện này luôn luôn đúng thì phải :slight_smile: ( Cái này là nhận xét cá nhân thoai) :slight_smile: tại mình thấy nếu i = 0(j = 0)i < d (j < c), i++ (j++) roài thì i + 1 ( j + 1) phải luôn bé hơn d(c) chứ nhỉ , à mà mình cũng chưa hiểu cái đề bài lắm :slight_smile:

@POs tham gia diễn đàn cũng lâu rồi mà sao không dùng mardown để post code?

à đề bài là điếm số lượng phần tử cực trị của ma trận (phần tử được gọi là cực tri khi chúng nhỏ nhất hoặc lớn nhất các phần tử xung quanh nó?

à… có nghĩa là tìm và đưa ra các phần tử lớn nhất và nhỏ nhất trên 1 dòng, 1 cột hử ?? :slight_smile:

à không !
vd nha:
1 2 3
4 5 6
7 8 9
số 1 là cực trị xung quanh nó la 2,5,4 tức nó nhỏ nhất
số 9 là cực trị xung quanh nó la 6,5,8 tức là nó lớn nhất

cực trị la nhỏ nhất hoặc lớn nhất các phần tử xung quanh nó á bạn có cách viết nào hay hơn chỉ hoặc góp ý mình với nha cám ơn bạn nhiều

Mình có một ý này :slight_smile: khi mình gặp các bài toán về ma trận thì mình hay bật excel lên để làm ví dụ, hay là bạn thử làm cách đó đi :slight_smile: mình thấy đôi lúc nó cũng hiệu quả lắm.

Anh có thể đọc hết cái đề không anh ?
Cực trị có hai loại lớn và nhỏ, đề yêu cầu làm cái gì ?
Anh nói vắn tắt thế không hiểu được anh ơi

haha! cuối cùng cũng xong!
à đề là điếm số lượng phần tử cực trị ! một phần tử được gọi là cực trị khi nó lớn hoặc nhỏ hơn các phần tử xung quanh nó
mình làm được rồi ! hi vọng sẽ có cách ngắn hơn !

#include<iostream>
using namespace std;
#include<conio.h>
#include<limits.h>
int nm_2c(int a[][100],int &d,int &c){

cout<<"a[so dong][so cot]\n";
cout<<"nhap so dong cua mang  ";cin>>d;cout<<"\n";
cout<<"nhap so cot cua mang";cin>>c;
for(int i=0;i<d;i++)
{
	for(int j=0;j<c;j++)
	{
	cout<<"nhap ["<<i<<"]["<<j<<"]\t";cin>>a[i][j];
	}
}

}
void xuat_mang(int a[100][100],int d,int c){
for(int i=0;i<d;i++)
{
	for(int j=0;j<c;j++)

	cout<<"\t"<<a[i][j];
	cout<<endl;

}

}
int diemsoluongphantucuctri(int a[][100],int d,int c )
{
	int diem=0;
	for(int i=0;i<d;i++)
	{
		for(int j=0;j<c;j++)
		{
			int max=INT_MIN;
			int min=INT_MAX;
			if( i-1<0)
			{
				//>loi ko xet
			}
		    else
		    {
	 	    	max=a[i-1][j]>max?a[i-1][j]:max;
	            min=a[i-1][j]<min?a[i-1][j]:min;	    
			}
			if(i+1==d)
			{
				//loi ko xet
			}
			else
			{
				max=a[i+1][j]>max?a[i+1][j]:max;
	            min=a[i+1][j]<min?a[i+1][j]:min;
			}
			if(j-1<0)
			{
				//loi ko xet 
			}
			else
			{
					max=a[i][j-1]>max?a[i][j-1]:max;
	            min=a[i][j-1]<min?a[i][j-1]:min;
			}
			if(j+1==c)
			{
				//loi ko xet
			}
			else
			{
					max=a[i][j+1]>max?a[i][j+1]:max;
	            min=a[i][j+1]<min?a[i][j+1]:min;
			}
             if(a[i][j]>max||a[i][j]<min)
			 { cout<<a[i][j]<<"\n";
			 	diem++;
			 }		
		
		}
		
		
		
	}
	
	
	
	return diem;
}
int main()
{
int d,c,x,i,j,n,kq,k;
int a[100][100];
int tong;
int tg;
nm_2c(a,d,c);
xuat_mang(a,d,c);
cout<<"\n cac phan tu cuc tri la \n";
int soluong=diemsoluongphantucuctri(a,d,c);
cout<<"so luong phan tu cuc tri la "<<soluong;
}
1 Like

Anh ơi, anh phải nói rõ đề mới được chứ ?
Đề kêu tìm cực trị ở đâu, anh nói chung chung thế làm sao người ta biết được

VD như: tìm cực trị của một mảng 2 chiều (ma trận, …) thì người ta mới biết.

Chứ tìm cực trị thì có thể tìm cực trị trong ô nhỏ, … vì dạng này em làm nhiều kieur bài

1 Like
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<iomanip>
#include<conio.h>

using namespace std;

void createMatrix(int **&a, int &m, int &n)
{
	cin >> m >> n;
	a = new int*[m];
	srand(time(NULL));
	for (int i = 0; i < m; i++)
	{
		a[i] = new int[n];
		for (int j = 0; j < n; j++)
		{
			a[i][j] = (rand() % (101 - 50))+50;
		}
	}
}

bool isMaxMatrix(int **a, int m, int n, int ix, int jx)
{
	int di[] = { -1,-1,-1,  0, 0,  1, 1, 1 };
	int dj[] = { -1, 0, 1, -1, 1, -1, 0, 1 };
	int no = a[ix][jx];
	bool CT = true, CD = true;
	for (int i = 0; i < 8; i++)
	{
		if (ix + di[i] >= 0 && ix + di[i] < m && jx + dj[i] >= 0 && jx + dj[i] < n)
		{
			if (no < a[ix + di[i]][jx + dj[i]]) CD = false;
			if (no > a[ix + di[i]][jx + dj[i]]) CT = false;
			if (!CD && !CT) break;
		}
	}
	if (!CD && !CT) return false;
	return true;
}

void showMatrix(int **a, int m, int n)
{
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cout << setw(5) << a[i][j];
		}
		cout << endl;
	}
}

void dem(int  **a, int m, int n)
{
	int rs = 0;
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (isMaxMatrix(a, m, n, i, j))
			{
				rs++;
				 cout << i+1 << " " << j+1 <<" "<< a[i][j] << endl;
			}
		}
	}
    cout << rs;
}

void freeMatrix(int **&a, int m)
{
	for (int i = 0; i < m; i++)
	{
		delete a[i];
	}
	delete[] a;
}

int main()
{
	int **a, m, n;
	createMatrix(a, m, n);
	showMatrix(a, m, n);
	dem(a, m, n);
	freeMatrix(a, m);

	return 0;
}

:slight_smile: Cái này là mình tìm cực trị như bạn nói và đưa ra luôn vị trí của cực trị đó trong một ma trận(mảng 2 chiều) random. :smiley: , à quên mình cho nó random từ 50 - 101 :slight_smile:

oh! cám ơn bạn nhiều nha!

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