Java - Matrices - Punto de silla

 
Vista:
sin imagen de perfil
Val: 31
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

Matrices - Punto de silla

Publicado por Joker (27 intervenciones) el 02/11/2019 17:02:33
Hola!

Necesito ayuda en sacar el punto de silla ya que no lo consigo.
El programa es el siguiente:

Programa que nos permita obtener todos los puntos de silla que pueda tener una matriz de 6 filas y 6 columnas. Un punto de silla es aquel que es valora máximo de su fila y a la vez mínimo de su columna.

El problema es que yo por ejemplo meto la siguiente matriz:
4 5 3 2 1 4
3 7 2 5 8 4
2 8 6 3 5 6
3 9 5 2 4 3
2 6 4 7 3 2
3 7 5 6 8 1
Siempre me aparece el número 9 y debería de aparecer el 5 pero no sé como arreglarlo.
Yo tengo este programa:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.util.Scanner;
 
public class PuntoDeSilla {
	public static void main (String[] args) {
 
		Scanner sc = new Scanner (System.in);
		int[][] matriz = new int [6][6];
		int i, j;
 
		System.out.println ("Introduce los valores de la matriz: ");
		for (i=0; i<6; i++)
			for (j=0; j<6; j++) {
				System.out.print (" - Fila " + (i+0) + " Columna " + (j+0) + ": ");
				matriz[i][j] = sc.nextInt();
			}
 
		System.out.println ("\n");
 
		//Sacar el punto de silla
		for (i=0; i<6; i++) {
			matriz[i][5]=matriz[i][0]; //saca el menor de la fila
			for (j=0; j<6; j++)
				if (matriz[i][j] > matriz[5][i])
					matriz[5][i] = matriz[i][j];
		}
 
 
		for (i=0; i<6; i++)
			for (j=0; j<6; j++) {
				if (matriz[i][5]==matriz[5][j])
					System.out.println ("El punto de silla es: " + matriz[i][5]);
			}
	}
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Matrices - Punto de silla

Publicado por Kabuto (1385 intervenciones) el 02/11/2019 23:55:52
Hola.

Creo que es mejor plantearlo usando funciones/métodos que se dediquen a tareas concretas.

A mi se me ha ocurrido hacerlo con dos funciones.

Una se va a encargar de encontrar el valor menor de la COLUMNA que se le indique, para ello, recibe como parámetros la matriz de números y el número de columna que ha de comprobar.

Cuando encuentre el valor menor, también va a registrar en que FILA lo ha encontrado, y va a retornar estos dos valores (el número menor y su FILA) juntos en un pequeño array de dos elementos.
Es decir:
array[0] --> Valor menor de esta columna
array[1] --> Fila de la matriz donde se encuentra este valor menor.

La siguiente función se va a encargar de comprobar si ese valor menor que se ha encontrado en la COLUMNA, es también el valor mayor de su FILA.
Para ello esta función va a recibir dos valores, el número que queremos comprobar y la FILA completa a la que pertenece.
La FILA completa la extraemos de la matriz mediante el segundo valor del array (array[1]) que nos había devuelto la primera función.

Así, esta segunda función recorre la FILA y si confirma que ese número es el mayor de la FILA, retorna true y ya tenemos un punto de silla.
De lo contrario, retorna false y repetimos todo el proceso con la siguiente COLUMNA.

Puede que así explicado sea un poco lioso, te dejo el código por si se entiende mejor:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
public class PuntoSilla {
 
	final static int[][] MATRIZ = {{4,5,3,2,1,4},
								   {3,7,2,5,8,4},
								   {2,8,6,3,5,6},
								   {3,9,5,2,4,3},
								   {2,6,4,7,3,2},
								   {3,7,5,6,8,1}};
 
	static int[] getMenorColumna(int[][] matriz, int col) {
		//Tomamos como referencia para comparar el primer valor de la columna
		int menor = matriz[0][col];
		int fila = 0;
		//Recorremos columna, si encontramos un menor lo guardamos y también la fila donde pertence
		for (int fil = 1; fil < matriz.length; fil++) {
			if (matriz[fil][col] < menor) {
				//Hemos encontrado un valor menor, lo guardamos
				menor = matriz[fil][col];
				//y su fila donde se ha encontrado
				fila = fil;
			}
		}
		//Finalizado el for, ya tenemos el valor menor y la fila a la que pertence.
		//Retornamos ambos valores en un array de dos elementos.
		return new int[] {menor, fila};
	}
 
	static boolean esMayorDeFila(int valor, int[] filaMatriz) {
		/*
		 * Recorremos la fila completa recibida y comparamos valores.
		 * Si encontramos un valor que es mayor al que nos ha indicado
		 * retornaremos false, pues se confirma que el valor indicado
		 * NO es el mayor de su fila
		 */
		for (int valorFila: filaMatriz)
			if (valorFila > valor)
				return false; //Hay un valor mayor, terminamos búsqueda con un false
 
		//Si el bucle for ha finalizado sin retornar false, es que este valor SI es mayor de su fila
		return true;
	}
 
	public static void main(String[] args) {
		/*
		 * Recorremos columnas buscando el valor menor y
		 * a que fila pertenece.
		 * Acto seguido comprobamos si ese valor es también el 
		 * mayor de la fila a la que pertenece. 
		 */
		for (int col = 0; col < MATRIZ[0].length; col++) {
			System.out.println("\nBuscando puntos de silla en columna: " + col + "...");
			int[] menor = getMenorColumna(MATRIZ, col);
			if (esMayorDeFila(menor[0], MATRIZ[menor[1]])) {
				System.out.println("Punto de silla encontrado: " + menor[0]);
				System.out.println("Fila: " + menor[1] + " / Columna: " + col);
			}
		}
 
	}
 
}

Y este ese el resultado que obtenemos en pantalla:
1
2
3
4
5
6
7
8
9
10
11
12
13
Buscando puntos de silla en columna: 0...
 
Buscando puntos de silla en columna: 1...
Punto de silla encontrado: 5
Fila: 0 / Columna: 1
 
Buscando puntos de silla en columna: 2...
 
Buscando puntos de silla en columna: 3...
 
Buscando puntos de silla en columna: 4...
 
Buscando puntos de silla en columna: 5...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar