Foro de elhacker.net

Programación => Java => Mensaje iniciado por: CarlosvAlencia en 15 Febrero 2014, 17:39 pm



Título: Duda sobre este ejercicio
Publicado por: CarlosvAlencia en 15 Febrero 2014, 17:39 pm
Hola buenas tardes a ver tengo una duda sobre un ejercicio : El ejercicio consiste en formar palabras de tamaño mayores o iguales que 3 con la condicion de que se sean palindromas. Es decir tu tienes un tablero de nxn caracteres y tienes que formar palabras con esa condicion y sin que se pueda usar la misma casilla en la palabra. Tengo el codigo casi echo pero no se como hacer lo de que no se use la misma casilla dos veces alguien me puede ayudar?
El codigo es este :
public class Crossword {
   //Atributes
   
   private ArrayList<String> list;
   private char[][] panel;
   private int size;
   
   //Constructor
   public Crossword(int size , char[][] panel){
      this.size=size;
      this.panel=panel;
      this.list = new ArrayList<String>();
   }
   //Class anonima
   public Comparator<String> lexicographically = new Comparator<String>(){
                public int compare(String o1, String o2) {
                  if (o1.length() > o2.length()) {
                     return 1;
                        } else
                              if (o1.length() < o2.length()) {
                                 return -1;
                              }
                  return o1.toString().compareToIgnoreCase(o2.toString());
               }  //Compare
          };//Comparator
   public void buildWords(int i, int j, int direction, String words){
      int next_i=0; int next_j=0;
      switch (direction) {
                   case 1: // Up         
                      next_i = i - 1;
                      next_j = j;
                      break;
                   case 2: // Diagonal up right
                      next_i = i - 1;
                      next_j = j + 1;
                      break;
                     case 3: // Right
                        next_i = i;
                        next_j = j + 1;
                      break;
                   case 4: // Diagonal down right
                      next_i = i + 1;
                      next_j = j + 1;
                      break;
                   case 5: // Down
                      next_i = i + 1;
                      next_j = j;
                      break;
                     case 6: // Diagonal down left
                       next_i = i + 1;
                      next_j = j - 1;
                      break;
                   case 7: // Left
                      next_i = i;
                      next_j = j - 1;
                      break;
                   case 8: // Diagonal up left
                      next_i = i - 1;
                      next_j = j - 1;
                      break;
                }//switch
      if ((next_i >= 0 && next_i < this.size) &&
            (next_j >= 0 && next_j < this.size) ) {
                
            words = words + this.panel[j];
            System.out.println(words);
               }
                                 
                  if (words.length() >= 3) {
                     int contador =0; String aux = "";
                     for(int h = words.length()-1; h>=0; h--){
                        aux = aux + words.charAt(h);
                     }
                     for(int l=0 ; l<=aux.length()-1 ; l++){
                        if(aux . charAt(j) == words.charAt(j)){
                           contador++;
                        }
                     }
                     if(!this.list.contains(words) && contador == words.length()){
                        
                           this.list.add(words);
                     }
           }
   }
   public static void main(String[] args) {
      Scanner scan = new Scanner(System.in);
      //Declaracion de variables      
      //Test indica el numero de test.
      //Size indica la longitud del tablero
      //Chart es una matriz de caracteres
      //Words es un vector de la clase Crossword
      //Text almacena la cadena de caracteres introducida por consola
      int test; int size;  char[][] chart; Crossword[] words;
      ArrayList<String> words2;
      String text;
      //Leo los test que se quieren pasar
      System.out.println("Numero de test: ");
      test = scan.nextInt();
      
      words = new Crossword[test];
      int n=0;
      while(n<test){         
          System.out.println("Tamaño de tabla: ");         
          size = scan.nextInt();
            chart = new char[size][size];
                  for(int i = 0; i < chart.length; i++){
                     
                       text = scan.next();
         
                      for(int j = 0; j < text.length(); j++){
                         /**
                         * char charAt(int index)
                              * Devuelve el carácter indicado
                              * como índice. El primer carácter de la cadena será
                              * el del índice 0. Junto con el método .length() podemos
                              * recuperar todos los caracteres de la cadena de texto.
                         */
                            chart[j] = text.charAt(j);
               }//for interno                  
            }//for externo 1
                  if(test-1==n){
                     words[n]=new Crossword(size,chart);
                     for (int i = 0; i < size; i++){
                                    for (int j = 0; j < size; j++){
                                        // Las 8 direcciones de cada elemento
                                        for (int d = 1; d <= 8; d++){
                                           words[n].buildWords(i, j, d, "");                  
                                  }
                              }
                     }                                 
                  }else{
                     words[n]=new Crossword(size,chart);
                     for (int i = 0; i < size; i++){
                                    for (int j = 0; j < size; j++){
                                        // Las 8 direcciones de cada elemento
                                        for (int d = 1; d <= 8; d++){
                                           words[n].buildWords(i, j, d, "");                  
                                  }//for
                              }//for
                     }//for
                  }//else
               n++;
       }//while
      scan.close();
      words2 = new ArrayList<String>();
      int i =0;
      while ( i<words.length){
         words2 = words.getList();
         if(words.length-1==i){
            for(String word : words2){
               if(!word.isEmpty()){
                  System.out.println(word);
               }//if
            }//for each            
         }//if
         else{
            if(words.length-1!=i){
               for(String word : words2){
                  if(!word.isEmpty()){
                     System.out.println(word);
                  }//if
               }//for each
                System.out.println("");
            }//if
         }//else
         i++;
      }//while
   }//Main
   public ArrayList<String> getList() {
      int i=0;
      while ( i < this.list.size())
      Collections.sort(this.list, lexicographically);
      i++;
      return list;
   }//getList   
}//Crossword


Título: Re: Duda sobre este ejercicio
Publicado por: NikNitro! en 18 Febrero 2014, 15:01 pm
Crea otro tablero de las mismas dimensiones lleno de true. Cuando vayas a usar una casilla comprueba que está en true. Cuando la uses, cambiala a false.

Creo que es lo que pides.

Salud ;)