C/Visual C - Ayuda en C (sopa de letras)

   
Vista:

Ayuda en C (sopa de letras)

Publicado por Paulo (1 intervención) el 22/11/2009 21:31:39
Amigos:

Tengo que elaborar un programa que dado una sopa de letras y un diccionario con las palabras a buscar,
me genere la respuesta con las palabras del diccionario encontradas en la sopa, indicando la palabra y en que
ubicación la encontró...

ejemplo: que me encuentre la palabra CASA

QWYDGFDSA
ASDCASAGZ
NMCVDESFH
HTRHREWAS

CASA ubicado en posicion (2,4) sentido horizontal comenzando de izq a derecha

Ahora mi consulta es como crear el ciclo para que cuando me encuentre la primera letra, en este caso la C .....
busque la siguiente que es la A y asi que busque la S y termine con la letra final que es la A.
Solo tengo la duda, en como hacer la estructura del ciclo, para que cuando encuentre la primera letra de un diccionario de palabras leido, pueda
hacer la busqueda con la siguiente letra que debe buscar... SOLO necesito como crear ese ciclo.

mi codigo e idea es este:

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>

char Sopa[50][50];
char palabra1[16];
char palabra2[16];
char palabra3[16];
char palabra4[16];
char palabra5[16];
char palabra6[16];
char palabra7[16];
char palabra8[16];
char palabra9[16];
char palabra10[16];
char palabra11[16];
char palabra12[16];
char palabra13[16];
char palabra14[16];
char palabra15[16];

void leerArchivo()
{
int i,j;
char sopastring[54];
FILE *ArchivoS,*ArchivoD;
ArchivoS=fopen("sopa.txt","r");
ArchivoD=fopen("diccionario.txt","r");
if (ArchivoS==NULL || ArchivoD==NULL)
{
printf("\tERROR NO SE ENCUENTRAN LOS DATOS\n\tPRESIONE UNA TECLA PARA SALIR\n");
getch();
exit(0);
}
for(i=0;!feof(ArchivoS);i++)
{
fgets(sopastring,54,ArchivoS);
sopastring[strlen(sopastring)-1]='\0';
for(j=0;j<50;j++)
{
Sopa[i][j]=sopastring[j];
}
}

fclose(ArchivoS);

fgets(palabra1,16,ArchivoD);
palabra1[strlen(palabra1)-1]='\0';
fgets(palabra2,16,ArchivoD);
palabra2[strlen(palabra2)-1]='\0';
fgets(palabra3,16,ArchivoD);
palabra3[strlen(palabra3)-1]='\0';
fgets(palabra4,16,ArchivoD);
palabra4[strlen(palabra4)-1]='\0';
fgets(palabra5,16,ArchivoD);
palabra5[strlen(palabra5)-1]='\0';
fgets(palabra6,16,ArchivoD);
palabra6[strlen(palabra6)-1]='\0';
fgets(palabra7,16,ArchivoD);
palabra7[strlen(palabra7)-1]='\0';
fgets(palabra8,16,ArchivoD);
palabra8[strlen(palabra8)-1]='\0';
fgets(palabra9,16,ArchivoD);
palabra9[strlen(palabra9)-1]='\0';
fgets(palabra10,16,ArchivoD);
palabra10[strlen(palabra10)-1]='\0';
fgets(palabra11,16,ArchivoD);
palabra11[strlen(palabra11)-1]='\0';
fgets(palabra12,16,ArchivoD);
palabra12[strlen(palabra12)-1]='\0';
fgets(palabra13,16,ArchivoD);
palabra13[strlen(palabra13)-1]='\0';
fgets(palabra14,16,ArchivoD);
palabra14[strlen(palabra14)-1]='\0';
fgets(palabra15,16,ArchivoD);
palabra15[strlen(palabra15)-1]='\0';

fclose(ArchivoD);
}

void ImprimeSopa()
{
int i,j;
printf("\n\n\n");
printf(" ");
for(i=0;i<50;i++)
{
if(i<9)
{
printf("%i ",i+1);
}
else
{
printf("%i ",i+1);
}
}
printf("\n\n");
for(i=0;i<50;i++)
{
if(i<9)
{
printf(" %i ",i+1);
}
else
{
printf(" %i ",i+1);
}
for(j=0;j<50;j++)
{
printf("%c ",Sopa[i][j]);
}
printf("\n");
}

printf("\n\n\n");
for(i=0;i<15;i++)
{
switch(i)
{
case 0: printf(" %s\n",palabra1);
break;
case 1: printf(" %s\n",palabra2);
break;
case 2: printf(" %s\n",palabra3);
break;
case 3: printf(" %s\n",palabra4);
break;
case 4: printf(" %s\n",palabra5);
break;
case 5: printf(" %s\n",palabra6);
break;
case 6: printf(" %s\n",palabra7);
break;
case 7: printf(" %s\n",palabra8);
break;
case 8: printf(" %s\n",palabra9);
break;
case 9: printf(" %s\n",palabra10);
break;
case 10: printf(" %s\n",palabra11);
break;
case 11: printf(" %s\n",palabra12);
break;
case 12: printf(" %s\n",palabra13);
break;
case 13: printf(" %s\n",palabra14);
break;
case 14: printf(" %s\n",palabra15);
break;
}

}
getch();
}

Solo necesito crear la funcion para qe busque las palabras en los diferentes sentidos !
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Ayuda en C (sopa de letras)

Publicado por jose (1 intervención) el 17/12/2009 18:08:31
No es que yo sea muy bueno en esto, pero...

Me resulta curioso que uses una variable (y un for) distintos para cada palabra. Supongo que se trata de una tarea de aprendizaje y todavía no puedes elegir un método más elegante para resolverla.

Para que después de la C busque la A, puedes incorporarlo como condición al bucle del for:

/* Esto sólo funcionará si ya has encontrado la primera letra de la palabra */
/* Además, sólo funciona en horizontal */
/* Se puede hacer que funcione en vertical cambiando [i+c] por [i+c*dirx][i+j*dirj] */
/* (dirx y dirj son 1, -1 o 0), pero eso ralentiza el proceso... */
for (c=0, (c<strlen(palabra1)) && (Sopa[i+c][j]==palabra1[c]),c++)

O bien usar un break.

A la hora de buscar palabras, en Algoritmia.net usan un sistema distinto.

Construyen un diccionario con todas las palabras y otro con las palabras al revés (por ejemplo, "casa" estaría dos veces, una como CASA y otra como ACSA.

Por otro lado, generan una matriz con la sopa "recta" y otra con las diagonales, y buscan en ambas.

http://www.algoritmia.net/problems.php?id=20&option=solucion
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda en C (sopa de letras)

Publicado por Rafael (1 intervención) el 20/04/2013 08:14:50
el programa me da un error( error:unresolvd external ´_main´referenced from c:\BC5\LIB\C0X32\.OBJ
seria genial que alguien me dijera porque del error?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar