30/09/2018, 16:57

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]
";
    cout<<"nhap so dong cua mang  ";
    cin>>d;
    cout<<"
";
    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<<"]	";
            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<<"	";
            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:
";
    int tong=diemsocuctri(a,d,c);
    cout<<"so luong phan tu cuc tri la"<<tong;
}
P Os viết 19:05 ngày 30/09/2018

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

Trịnh Minh Cường viết 19:05 ngày 30/09/2018

if(i+1!=d)

		{
				Max=((a[i+1][j]&gt;Max)?a[i+1][j]:Max);
			Min=((a[i+1][j]&lt;Min)?a[i+1][j]:Min);

		}

if(j+1!=c)

		{
				Max=((a[i][j+1]&gt;Max)?a[i][j+1]:Max);
			Min=((a[i][j+1]&lt;Min)?a[i][j+1]:Min);
		
		}

Hình như 2 cái điều kiện này luôn luôn đúng thì phải ( Cái này là nhận xét cá nhân thoai) 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

Nguyễn Minh Dũng viết 19:10 ngày 30/09/2018

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

Làm sao để có thể hiển thị syntax highlighting bằng markdown? Các bạn phải đánh dấu ``` như ví dụ dưới đây Chú ý, dấu ``` được tạo ra bởi nút nằm bên trái số 1 trên bàn phím, nút này sẽ là ~ khi bấm giữ Shift Ví dụ cho C Nội dung: ``` void main() { } ``` Và đừng quên ``` ở cuối Kết quả void main() { } Ví dụ cho Pascal Nội dung: ``` Program HelloWorld; Begin WriteLn('Hello world!') {no ";" is required after the last statement of a block - adding one adds a "null stateme…
P Os viết 19:06 ngày 30/09/2018

à đề 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ó?

Trịnh Minh Cường viết 19:00 ngày 30/09/2018

à… 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ử ??

P Os viết 19:13 ngày 30/09/2018

à 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

Trịnh Minh Cường viết 19:05 ngày 30/09/2018

Mình có một ý này 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 mình thấy đôi lúc nó cũng hiệu quả lắm.

nhatlonggunz viết 19:05 ngày 30/09/2018

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

P Os viết 19:11 ngày 30/09/2018

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;
}
nhatlonggunz viết 19:00 ngày 30/09/2018

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

Trịnh Minh Cường viết 19:06 ngày 30/09/2018
#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;
}

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. , à quên mình cho nó random từ 50 - 101

P Os viết 19:01 ngày 30/09/2018

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

Bài liên quan
0