- #include <stdio.h>
- #include <stdlib.h>
- int **copy_matrix(int *ordem); //encontra a ordem da matriz e armazena em *ordem, e copia os dados de entrada
- void fprint_sela(int **m, int ordem, int col_max[ordem], int line_min[ordem]); //calcula e imprime os pontos de sela da matriz armazenada em **m
- int main()
- {
- int i, j, n, col_max[n], line_min[n];
- int **m;
- m=copy_matrix(&n);
- fprint_sela(m, n, col_max, line_min);
- for (i=0; i<n; i++) //libera os vetores alocados na função copy_matrix
- free(m[i]);
- free(m);
- return 0;
- }
- int **copy_matrix(int *ordem)
- {
- int n, i, j, x; //n = ordem; demais são variáveis auxiliares.
- int **m; //vamos armazenar os dados de entrada da matriz nesse apontador duplo
- char aux[100], line[100], *coment; //string auxiliar
- fscanf(stdin, "%d", ordem); //pega o primeiro dado da primeira linha - ou seja, a ordem da matriz
- n=*ordem;
- if(n>20)
- {
- printf("Dados Inválidos\n"); //Só permite armazenamento de matrizes de ordem máxima = 20
- exit(0);
- }
- fgets(aux, 99, stdin); //Para pular os comentários da primeira linha
- m = (int **) malloc(n*sizeof(int *));
- if(!m)
- {
- printf("FALHA ALOCAÇÃO MEMÓRIA");
- exit(0);
- }
- for (i=0; i<n; i++)
- {
- m[i] = (int *) malloc(n*sizeof(int));
- if(!m[i])
- {
- printf("FALHA ALOCAÇÃO MEMÓRIA");
- exit(0);
- }
- }
- i=0;
- while(fgets(line, 100, stdin))
- {
- scanf("%d ", &m[i][0]);
- for (j=1; j<n; j++)
- {
- x = scanf( "%d ", &m[i][j]);
- if (x==0) //acusa a falta de dados, caso em que scanf retorna EOF
- {
- printf("Dados Inválidos");
- exit(0);
- }
- }
- scanf("%[^\n]", coment);
- i++;
- }
- /*
- for (i=0; i<n; i++)
- {
- for (j=0; j<n; j++)
- {
- x = scanf( "%d ", &m[i][j]);
- if (x==0) //acusa a falta de dados, caso em que scanf retorna EOF
- {
- printf("DADOS INVALIDOS");
- exit(0);
- }
- }
- scanf("%[^\n]", coment); //para pular comentários nas linhas
- }
- */
- return m;
- }
- void fprint_sela(int **m, int ordem, int *col_max, int *line_min) //calcula e imprime os pontos de sela
- {
- int i, j, n, count=0; //variáveis auxiliares
- n=ordem;
- fprintf(stdout, "\nOs pontos de sela são:\n");
- for(j=0; j<n; j++) //encontra o maior elemento de cada coluna
- {
- col_max[j] = m[0][j];
- for(i=1; i<n; i++)
- {
- if(m[i][j] > col_max[j])
- col_max[j] = m[i][j];
- }
- }
- for(i=0; i<n; i++) //encontra o menor elemento de cada linha
- {
- line_min[i] = m[i][0];
- for(j=1; j<n; j++)
- {
- if(m[i][j] < line_min[i])
- line_min[i] = m[i][j];
- }
- }
- for(i=0; i<n; i++)
- {
- for(j=0; j<n; j++)
- {
- if(m[i][j] == col_max[j] && m[i][j] == line_min[i]) //testa se um elemento m[i][j] é o máximo de sua linha (i)
- { //e de sua coluna (j) - ou seja, se é um ponto de sela.
- fprintf(stdout, "%4d %4d %4d \n", i, j, m[i][j]);
- count++;
- }
- }
- }
- if (count==0) //se a condição do if não for satisfeita nenhuma vez, count ==0 e não temos pontos de sela.
- fprintf(stdout, "nenhum\n");
- }