Por Nacho Cabanes
Nivel de dificultad aproximado (1 a 5): 2
Debes indicar si una serie de matrices tienen alguna fila repetida.
La primera línea indicará la cantidad de casos a probar (no más de 1000).
Para cada caso, una primera línea contendrá el ancho y el alto de cada matriz (no más de 1000). Las siguientes líneas (tantas como indique el alto) serán los datos de una fila de la matriz, números enteros entre -10000 y 10000 (tantos como indique el ancho), separados por uno o varios espacios en blanco.
Deberás responder SI en caso de que alguna de las filas de la matriz esté repetida, o NO en caso contrario.
(Asegúrate de que has leído las preguntas frecuentes antes de plantear tu solución)
Ejemplo de entrada
4 3 2 1 2 3 -1 0 1 4 3 5 1 2 3 -1 0 3 1 5 1 2 3 5 5 1 1 1 1 1 123 345 567 -123 -345 0 1 28 -34 57 -23 -21 -19 -15 -10 1 1 1 1 1 2 2 1 11 11 1Ejemplo de salida correspondiente
NO SI SI NO
Original en: Recopilación de retos, Nacho Cabanes
//Reto de: Recopilación de retos, Nacho Cabanes. //Realizado por: DG. //Fecha: 21/12/2015. using System; namespace Retos{ class Program{ public static Boolean FRDeterminarEntero1(String[] Asdato1){ Boolean Bcorrecto1=true; short iprobar1; foreach(String sDatos1 in Asdato1){ if(short.TryParse(sDatos1, out iprobar1)==false){ Bcorrecto1= false; break; } } return Bcorrecto1; }//Fin del metodo para determinar si los datos ingresados para el arreglo (Matriz) son enteros. public static String FRFilaRepetida1(String[] AsMatriz1){ String srepetir1="NO"; for(int i=0; i < AsMatriz1.Length ; i++){ String[] AsFilaDato1=AsMatriz1[i].Split((char[])null, StringSplitOptions.RemoveEmptyEntries); for(int i2=i+1; i2 < AsMatriz1.Length; i2++){ String[] AsFilaDatoComparar1=AsMatriz1[i2].Split((char[])null, StringSplitOptions.RemoveEmptyEntries); short icont1=0; for(int i3=0;i3 < AsFilaDato1.Length; i3++){ if (AsFilaDato1[i3].Equals(AsFilaDatoComparar1[i3])==true){ srepetir1="SI"; icont1++; }//Fin de que si se repiten los elementos de los dos areglos creados (AsFilaDato1 y AsFilaDatoComparar1). if(icont1==AsFilaDato1.Length){ goto Salir; }//Fin de que si la fila se repite. }//Fin del tercer for para determinar si se repiten las filas. }//Fin del segundo for para determinar si se repiten filas. }//Fin del primer for para recorrer las filas de la Matriz. //Para salir de los tres bucles si no se repiten filas. Salir: return srepetir1; }//Fin del metodo para determinar si se repite alguna fila del arreglo AsMatriz1. public static void Main(String[] args){ long icasos1=0; if(long.TryParse(Console.ReadLine(), out icasos1)==true){ for(int i=0;i<icasos1;i++){ ushort iancho1; ushort ialto1; String[] Asdimensiones1= Console.ReadLine().Split(' '); if(Program.FRDeterminarEntero1(Asdimensiones1)==true){ if(Asdimensiones1.Length == 2){ iancho1 = ushort.Parse(Asdimensiones1[0]); ialto1 = ushort.Parse(Asdimensiones1[1]); if(iancho1 < 1001 && ialto1 < 1001){ String[] AsMatriz1 = new String[ialto1]; for(int iFila1=0 ; iFila1 < ialto1 ; iFila1++){ String sDato1=Console.ReadLine(); String[] Asdato1=sDato1.Split((char[])null, StringSplitOptions.RemoveEmptyEntries); if(Program.FRDeterminarEntero1(Asdato1) ==true){ if(Asdato1.Length == iancho1){ AsMatriz1[iFila1]=sDato1; }//Fin de para determinar si se digitaron los numeros indicados por el ancho. }//Fin de para determinar si los numeros digitados todos son enteros. }//Fin del for para recorrer las filas del arreglo Matriz. Console.WriteLine(Program.FRFilaRepetida1(AsMatriz1)); }//Fin de que si digitan un numero de ancho y alto menor que 1001 para el arreglo actual AsMatriz1 (para evitar errores). }//Fin de que si se digitaron dos numeros para las dimesiones ancho y alto. }//Fin de que si son numeros lo que digitaron. }//Fin del for para repetir según el numero de casos (para evitar errores). }//Fin de que si se digita el numero de casos. }//Fin del metodo main. }//Fin de la clase Program. }//Fin del Namespace Retos.
import java.util.ArrayList; import java.util.Scanner; /** * @author Jorge * Fecha: 21-Dic-2015 * Notas del recopilador: * - No es necesario comprobar que los datos de entrada sean * de tamaño correcto * - Se debe responder caso a caso, en vez de memorizar todas * las respuestas y mostrar todas al final * (Aun así, la solución es correcta) */ public class FilaRepetida { public static boolean filaRepetida(int matriz[][], int filas, int columnas) { boolean resultado = false; boolean repetidas[]; principal: for (int i = 0; i < filas; i++) { repetidas = new boolean[filas]; for (int l = 0; l < repetidas.length; l++) { repetidas[l] = l > i; } for (int j = 0; j < columnas; j++) { for (int k = i + 1; k < filas; k++) { if (repetidas[k] && matriz[i][j] != matriz[k][j]) { repetidas[k] = false; } } } for (int l = 0; l < repetidas.length; l++) { if (repetidas[l]) { resultado = true; break principal; } } } return resultado; } public static void main(String args[]) { Scanner entrada = new Scanner(System.in); int pruebas = entrada.nextInt(); if (pruebas > 1000) { System.exit(-1); } else { ArrayList respuestas = new ArrayList(); for (int i = 0; i < pruebas; i++) { int ancho = Integer.parseInt(entrada.next()); int largo = Integer.parseInt(entrada.next()); if (ancho > 1000 | largo > 1000) { System.exit(1000); } else { int matriz[][] = new int[largo][ancho]; for (int j = 0; j < largo; j++) { for (int k = 0; k < ancho; k++) { matriz[j][k] = entrada.nextInt(); } } if (filaRepetida(matriz, largo, ancho)) { respuestas.add("SI"); } else { respuestas.add("NO"); } } } for (int j = 0; j < respuestas.size(); j++) { System.out.println(respuestas.get(j)); } } } }