Ayuda con Sopa De Letra En Java

Iniciado por Rijhording, 13 Abril 2010, 02:18 AM

0 Miembros y 1 Visitante están viendo este tema.

Rijhording

En este codigo pongo lo que son las palabras en un archivo con este nombre:lo guardo en mi disco D:\\texto.txt(esto es cuando me pide el nombre del fichero)
en el texto esta esto
A      I      B      M      O      L      O      C      N
R     N     E     S     P     A     Ñ     A     I
O     C     I     X     E     M     P     R     C
G     U     A     T     E     M     A     L     A
C     B     P     A     N     A     M     A     R
H     A     Y     I     L     E     A     P     A
I     O     C     I     X     E     G     E     G
L     H     Y     A     U     G     U     R     U
E     C     U     A     D     O     R     U     A

y cuando me pide el diccionario osea las palabras a buscar esta tambien en el disco D:\\diccionario.txt el cual las palabras son:
Argentina Chile Colombia Cuba Ecuador Espana Guatemala Mexico Nicaragua Panamá Peru Uruguay

No se si se pone asi las palabras porque en el programa lo carga pero no lo resuelve no encuentro porque la razon de no encontrarlo mi programa esta hecho en netbeans
Esperando que algun monstruo en java me ayude es para mi proyecto de Universidad Gracias.....ayudenme ps :P


import java.io.*;
public class BusquedaPalabras
{
private static final int MAX_FILAS=       64;
private static final int MAX_COLUMNAS=    64;
private static final int MAX_PALABRAS=100000;
private int filas;
private int columnas;
private int numPalabras;
private String [] palabras= new String[MAX_PALABRAS];
private BufferedReader sopaStream;
private BufferedReader palabraStream;
private char sopa[][]=new char[MAX_FILAS][MAX_COLUMNAS];
private BufferedReader in=new BufferedReader(new InputStreamReader(System.in));

public BusquedaPalabras()
{
sopaStream = abreFichero("introduzca fichero de la sopa");
palabraStream = abreFichero("y el del diccionario");
leeSopa();
leePalabras();

}

public int resolverSopa()
{
int numPal=0;
for(int f=0;f<filas;f++)
{
        for(int c=0;c<columnas;c++)
        {
            for(int df=-1;df<=1;df++)
            {
                for(int dc=-1;dc<=1;dc++)
                {
                    if(df!=0 || dc!=0)
                    {numPal=numPal+resolverDireccion(f,c,df,dc);
}
                }
            }

        }


}




                   
return numPal;
}

private static int busquedaPrefijo(String [] a,String x,int n)
{
int inf=0;
int sup=n-1;
while(inf<sup)
{
    int med=(inf+sup)/2;
    if(a[med].compareTo(x)<0)
    {
        inf=med+1;
    }
    else
        sup=med;
}
return inf;

}

private BufferedReader abreFichero(String mensaje)
{
String nombreFichero="";
FileReader fichero;
BufferedReader fichEntrada=null;
do
    {
        System.out.println(mensaje+":");
try
    {
        nombreFichero=in.readLine();
        if(nombreFichero==null)
        System.exit(0);
        fichero=new FileReader(nombreFichero);
        fichEntrada=new BufferedReader(fichero);

        String linea;
         while((linea=fichEntrada.readLine())!=null)
            System.out.println(linea);



}
    catch(IOException e)
    {System.err.println("No se Puede Abrir"+nombreFichero);}
    }while(fichEntrada==null);
System.out.println("Abierto"+nombreFichero);
return fichEntrada;
}

private void leePalabras()
{
numPalabras=0;

try
{
    while((palabras[numPalabras]=palabraStream.readLine())!=null)
    {
        if(numPalabras!=0&& palabras[numPalabras].compareTo
          (palabras[numPalabras-1])<0)
        {
            System.err.println("El diccionario no esta ordenado"+"ordenado-saliendo");
        }
        else if(++numPalabras>=MAX_PALABRAS)
            break;
       }
    if(palabraStream.ready())
        System.err.println("Aviso: no se han leido los"+"datos-incremente MAX_PALABRAS");
}
catch(IOException e)
{}

}

private void leeSopa()
{
String unaLinea;

    try
    {
    unaLinea=sopaStream.readLine();
        if(unaLinea==null)
        {
            filas=0;
            return;
        }
    columnas=unaLinea.length();
        for(int i=0;i<columnas;i++)
            sopa[0]=unaLinea.charAt(i);

        for(filas=1;
            (unaLinea=sopaStream.readLine())!=null;filas++)
        {
            if(unaLinea.length()!=columnas)
                System.err.println("La sopa es incorrecta");

        for(int i=0;i<columnas;i++)
            sopa[filas]=unaLinea.charAt(i);
        }
      }
        catch(IOException e)
        {}
}

private int resolverDireccion(int filaBase,int colBase,int filaDelta,int colDelta)
{

    String secuencia=" ";
    int numPal=0;
    int resultadoBusqueda;

    secuencia+=sopa[filaBase][colBase];
    for(int i=filaBase+filaDelta,j=colBase+colDelta;
            i>=0&& j>=0 && i<filas && j< columnas;
            i+=filaDelta,j+=colDelta)
    {
         secuencia+=sopa[j];
         resultadoBusqueda=busquedaPrefijo(palabras,secuencia,numPal);

         if(!palabras[resultadoBusqueda].startsWith(secuencia));
         break;

         if(palabras[ resultadoBusqueda ].equals( secuencia ))
         {
         numPal++;
         System.out.println("Encontrada"+secuencia + "de" + filaBase + "" + colBase +
                            "a" + i + "" + j);
         }

    }
    return numPal;

}


}

/*void main()*/
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
    BusquedaPalabras p=new BusquedaPalabras();
    System.out.println("Resolviendo....");
    p.resolverSopa();

    }

}







egyware

Uhh.. te rogaria que colocaras el codigo en etiquetas code=java para una mejor lectura

Rijhording

el codigo que e puesto esta para que solamente lo copien y lo prueben en sus respectivas maquinas quiero que me ayuden porfavor

Leyer

#3
Cita de: Rijhording en 13 Abril 2010, 05:44 AM
el codigo que e puesto esta para que solamente lo copien y lo prueben en sus respectivas maquinas quiero que me ayuden porfavor

jjjaja no me digas :xD, egyware quiere decir que para hacer mas entendible el codigo existen unas etiquetas, que q por cierto no colocaste

bueno volviendo al tema

1. Estas creando una matriz de 64*64 cuando es es de 10*10
2  Tu metodo para leer la sopa de letras en esta secuencia columnas=unaLinea.length(); esta mal ya que obtienes creo q 49 y en realidad tienen que ser 9
Código (java) [Seleccionar]

String t = unaLinea.replace(" ", "");
columnas = t.length();


y cuando haces esto, estas mal ya que es una matriz no un arraglo

Código (java) [Seleccionar]
sopa[0]=unaLinea.charAt(i);

Quedando de la siguiente forma, junto con la lectura para completar la matriz ya que estaba mal

Código (java) [Seleccionar]
int i=0;
   while((unaLinea = sopaStream.readLine())!=null){
   String t = unaLinea.replace(" ", "");
   columnas = t.length();
    for(int j=0;j<columnas;j++)
        sopa[i][j]=t.charAt(j);
        i++;
     }



Un Saludo.

Rijhording

haber mi estimado amigo Layer explicame bien porfavor:
mira este el codigo que me has explicado
lo que esta de color rojo es mi codigo que lo hize y el de azul es el tuyo que me has ayudado ahora mi duda es si esta bien puesto asi o como lo tengo que poner xq puesto de esa manera no me esta buscando nada y tienes razon lo e puesto unas matrices de 64*64 y eran solamente de 10*10porfavor necesito de tu ayuda gracias


private void leeSopa()
{
String unaLinea;
int i=0;
    try
    {
    unaLinea=sopaStream.readLine();
        if(unaLinea==null)
        {
            filas=0;
            return;
        }
   /*
    columnas=unaLinea.length();
        for(int i=0;i<columnas;i++)
            sopa[0]=unaLinea.charAt(i);
  */

    while((unaLinea = sopaStream.readLine())!=null){
    String t = unaLinea.replace(" ", "");
    columnas = t.length();
       for(int j=0;j<columnas;j++)
           sopa[j]=t.charAt(j);
           i++;

      }




    for(filas=1;
            (unaLinea=sopaStream.readLine())!=null;filas++)
        {
            if(unaLinea.length()!=columnas)
                System.err.println("La sopa es incorrecta");

        //for(int i=0;i<columnas;i++)
          //  sopa[filas]=unaLinea.charAt(i);
        }
      }
        catch(IOException e)
        {}
}


Leyer

Veamos usa este ya preparado

Código (java) [Seleccionar]
private void leeSopa()
{
String unaLinea;
   try {
   int i=0;
   while((unaLinea = sopaStream.readLine())!=null){
   String t = unaLinea.replace(" ", "");
   columnas = t.length();
    for(int j=0;j<columnas;j++)
        sopa[i][j]=t.charAt(j);
        i++;
    }
    }
       catch(IOException e){
        e.printStackTrace();
       }
  }


PD[] esto no resuelve tu problema general, solo es una solucion a un problema interno

Un Saludo.

Rijhording

pero Dime amigo leyer el texto esta bien es la manera correcta de ponerlo y para lo que es diccionario tambien esta bien
me explico esto va hacer mi sopa de letras que le pongo de nombre texto.txt
x x x x x x x x x
x x x x x x x x x
x x x x x x x x x
x x x x x x x x x
x x x x x x x x x
x x x x x x x x x
x x x x x x x x x
x x x x x x x x x
x x x x x x x x x
x x x x x x x x x
es una matris de 10*10 que sea que para x es una letra y forman algo

ahora para lo que es diccionario pongo en un archivo que lo voy a llamar diccionario.txt
y pongo lo siguiente en este orden
algo algo2 algo3 algo4 ... y asi en ese orden
o como es la manera de ponerlo derrepente es por eso que no me busca nada gracias de antemano

Leyer

Por tu manera de leer el archivo, tienes que colocarlo verticalmente

obj1
obj2
obj3

Aunke no se si ese resuelve tu problema general intenta de todas formas

Rijhording

pucha aun no consigo buscar nada en mi archivo alguna solucion si no es mucha molestia el codigo ya lo publique en la parte de arriba  :P

kilicho

#9
Hola amigo, queria saber si tienes tu sopa de letras lista necesito ayuda con ese tema tmb se te agradeceria te dejo mi correo -nota del mod: no se postea el mail-  gracias!