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();
}
}
Uhh.. te rogaria que colocaras el codigo en etiquetas code=java para una mejor lectura
el codigo que e puesto esta para que solamente lo copien y lo prueben en sus respectivas maquinas quiero que me ayuden porfavor
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
String t = unaLinea.replace(" ", "");
columnas = t.length();
y cuando haces esto, estas mal ya que es una matriz no un arraglo
sopa[0]=unaLinea.charAt(i);
Quedando de la siguiente forma, junto con la lectura para completar la matriz ya que estaba mal
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.
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)
{}
}
Veamos usa este ya preparado
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.
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
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
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
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!
:¬¬ pfff ayudale en vez de pedirle su tarea