Está en la página 1de 3

#include <stdio.

h>
#include <malloc.h>
#include <stdbool.h>
void read(int ***A, int *m, int *n)
{
int i, j;
printf("Nr. linii: ");
scanf_s("%d", m);
printf("Nr. coloane: ");
scanf_s("%d", n);
*A = (int **)malloc(*m * sizeof(int*));
for (i = 0; i < *m; i++)
(*A)[i] = (int *)malloc(*n * sizeof(int));
printf("Elementele matricii:\n");
for (i = 0; i < *m; i++)
for (j = 0; j < *n; j++)
scanf_s("%d", &(*A)[i][j]);
}
int min_mat(int **A, int m, int n)
{
int i, j, min = A[0][0];
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
if (A[i][j] < min)
min = A[i][j];
return min;
}
void delete_rows_cols(int ***A, int *m, int *n)
{
int i, j, i1, j1;
int min = min_mat(*A, *m, *n);
bool *vrows, *vcols;
vrows = (bool*)calloc(*m, sizeof(bool));
vcols = (bool*)calloc(*n, sizeof(bool));
for (i = 0; i < *m; i++)
for (j = 0; j < *n; j++)
if ((*A)[i][j] == min)
{
vrows[i] = 1;
vcols[j] = 1;
}
// Stergere linii
int dif_r = 0;
for (i = 0; i < *m; i++)
if(vrows[i])
{

for (i1 = i - dif_r; i1 < *m - 1; i1++)


for (j1 = 0; j1 < *n; j1++)
(*A)[i1][j1] = (*A)[i1 + 1][j1];
(*m)--;
dif_r++;
}
// Stergere coloane
int dif_c = 0;
for (i = 1; i < *n; i++)
if (vcols[i])
{
for (j1 = i - dif_c; j1 < *n - 1; j1++)
for (i1 = 0; i1 < *m; i1++)
(*A)[i1][j1] = (*A)[i1][j1 + 1];
(*n)--;
dif_c++;
}
/* // Varianta gresita datorita faptului ca in cazul in care exista
// cel putin 2 minime pe aceeasi coloana, programul sterge doar
// prima linie si coloana, astfel eliminand si celelalte minime
// de pe coloana si deci, lasand nesterse liniile acelor minime.
for (i = 0; i < *m; i++)
for (j = 0; j < *n; j++)
if ((*A)[i][j] == min)
{
int i1, j1;
for (i1 = i; i1 < *m - 1; i1++)
for (j1 = 0; j1 < *n; j1++)
(*A)[i1][j1] = (*A)[i1 + 1][j1];
(*m)--;
for (j1 = j; j1 < *n - 1; j1++)
for (i1 = 0; i1 < *m; i1++)
(*A)[i1][j1] = (*A)[i1][j1 + 1];
(*n)--;
}
*/
*A = (int **)realloc(*A, *m * sizeof(int*));
int k;
for (k = 0; k < *m; k++)
(*A)[k] = (int *)realloc((*A)[k], *n * sizeof(int));
free(vrows);
free(vcols);
}
void main()
{
int **A, m, n, i, j;
read(&A, &m, &n);
printf("\n");

delete_rows_cols(&A, &m, &n);


printf("Matricea rezultata este:\n");
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
printf("%d ", A[i][j]);
printf("\n");
}
printf("\n");
for (i = 0; i < m; i++)
free(A[i]);
free(A);
}

También podría gustarte