Tuesday, August 02, 2011

Solución al problema 2281 de la ICPC-ACM con Java

2281 - Color Me Less

import java.util.Scanner;

/**
 * p2281 - Color Me Less [http://livearchive.onlinejudge.org]
 * 
 * @author BreakDark
 * @version 1.0 beta
 */
// ACEPTADO!!! xD
public class Main {
 public static void main(String[] args) {
  Scanner Lee; // Para leer los datos de entrada
  short R, G, B; // para los colores que se van a leer
  short[][] vec = new short[16][3]; // para guardar los Colores
  short i; // para los bucles
  int min; // para guardar la distancia minima
  int[] vecDistancias = new int[16]; // vector de distancias

  // AQUI INICIA EL PROGRAMA
  Lee = new Scanner(System.in);
  // se lee los 16 primeros colores
  for(i = 0; i < 16; i++){
   vec[i][0] = Lee.nextShort();
   vec[i][1] = Lee.nextShort();
   vec[i][2] = Lee.nextShort();
  }
  /* se lee los demas colores, hasta que los colores sean R=G=B-1 */
  R = Lee.nextShort();
  G = Lee.nextShort();
  B = Lee.nextShort();
  while((R != -1) && (G != -1) && (B != -1)){
   // aqui se procesan los datos
   // buscamos su color mas proximo
   min = 195075;// 195075=3*255*255;
   for(i = 0; i < 16; i++){
    vecDistancias[i] = (R - vec[i][0]) * (R - vec[i][0]) + (G - vec[i][1]) * (G - vec[i][1]) + (B - vec[i][2]) * (B - vec[i][2]);
    if(vecDistancias[i] < min)
     min = vecDistancias[i];
   }
   System.out.print("(" + R + "," + G + "," + B + ") maps to ");
   // buscamos donde esta el color de menor distancia y lo
   // mostramos
   for(i = 0; i < 16; i++)
    if(vecDistancias[i] == min){
     System.out.println("(" + vec[i][0] + "," + vec[i][1] + "," + vec[i][2] + ")");
     break;
    }
   // System.out.println();
   R = Lee.nextShort();
   G = Lee.nextShort();
   B = Lee.nextShort();
  }
  //
  // System.out.println("\nFIN DEL PROGRAMA!!! - Todos los datos han sido procesados sin problemas");
  //
 }
}