Retos - 029: Fila repetida

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 1

Ejemplo de salida correspondiente

NO SI SI NO

Aportar una solución

Tu nombre (si quieres que aparezca):
Tu web/blog (si quieres que incluyamos un enlace a ella):
Tu e-mail (no se mostrará; si quieres que te avisemos cuando esté publicado):
¿Eres humano? ¿Cuánto es 2 más 3?
Lenguaje
Fuente:

//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));
            }
        }
 
    }
 
}