Bueno creo que lo mas eficiente es crear listas de palabras que sean todas validas y en eso me hallo y he creado este codigo para quitar todas las que no valgan:
Código C:
Ver original#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MIN_LEVEL 4
#define MAX_LEVEL 9
#define SIZE 10
//-----------------------------------------------------------------------------
int DelInvalidWordsDesc(char *nameFile,int size,int *nEliminadas);
int DelInvalidWordsAsc(char *nameFile,int size,int *nEliminadas);
int SearchBackWord(char *word,int length,char *anterior,int pos);
int SearchNextWord(char *word,int length,char *siguiente,int pos);
int SearchRepe(FILE *archivo,char *palabra);
int main(int argc, char* argv[])
{
int retval,palabrasDesechadas;
int contador=MIN_LEVEL;
char nameFileOrigen[25],nameFileDestino[25],nameFileSig[25];
//Limpio los archivos de palabras con 4,5,6,7,y 8 letras
do{
sprintf(nameFileOrigen
,"%i_Letras.txt",contador
); sprintf(nameFileSig
,"%i_Letras.txt",contador
+1); sprintf(nameFileDestino
,"%i_Letras_res.txt",contador
); retval=DelInvalidWordsAsc(nameFileOrigen,contador,&palabrasDesechadas);
switch(retval){
case -3:
printf("El archivo %s no se pudo limpiar. %s no se pudo abrir.",nameFileOrigen
,nameFileSig
); break;
case -2:
printf("El archivo %s no se pudo limpiar. %s no se pudo crear.",nameFileOrigen
,nameFileDestino
); break;
case -1:
printf("%s no se pudo limpiar porque no pudo abrirse.\n",nameFileOrigen
); break;
case 0:
printf("%s se pudo limpiar. %s creado exitosamente. Se eliminaron %i palabras.\n",nameFileOrigen
,nameFileDestino
,palabrasDesechadas
); rename(nameFileDestino
,nameFileOrigen
); break;
}
contador++;
}while(contador < MAX_LEVEL);
//Limpio el archivo de palabras de 9 letras
sprintf(nameFileOrigen
,"%i_Letras.txt",contador
); sprintf(nameFileSig
,"%i_Letras.txt",contador
-1); sprintf(nameFileDestino
,"%i_Letras_res.txt",contador
); retval=DelInvalidWordsDesc(nameFileOrigen,MAX_LEVEL,&palabrasDesechadas);
switch(retval){
case -3:
printf("El archivo %s no se pudo limpiar. %s no se pudo abrir.",nameFileOrigen
,nameFileSig
); break;
case -2:
printf("El archivo %s no se pudo limpiar. %s no se pudo crear.",nameFileOrigen
,nameFileDestino
); break;
case -1:
printf("%s no se pudo limpiar porque no pudo abrirse.\n",nameFileOrigen
); break;
case 0:
printf("%s se pudo limpiar. %s creado exitosamente. Se eliminaron %i palabras.\n",nameFileOrigen
,nameFileDestino
,palabrasDesechadas
); rename(nameFileDestino
,nameFileOrigen
); break;
}
return 0;
}
//---------------------------------------------------------------------------
int SearchNextWord(char *word,int length,char *siguiente,int pos)
{
char cadena[SIZE],salida[SIZE];
char nameFile[13]={0};
char aux;
int a,i,contador,retval;
FILE *archivo;
sprintf(nameFile
,"%i_Letras.txt",length
+1); archivo
=fopen(nameFile
,"r");
if(archivo != NULL){
fseek(archivo
,pos
,SEEK_SET
); do{
retval
=fread(cadena
,SIZE
,1,archivo
); contador=length;
for(a=0;a<length;a++){
for(i=0;i<=contador;i++){
if(word[a]==cadena[i])
{
aux=cadena[i];
cadena[i]=cadena[contador];
cadena[contador]=aux;
contador--;
break;
}
}
}
if(contador==0){
}else{
retval=-1;
}
}while(contador
!=0 && !feof(archivo
)); }else{
retval=-2;
}
return retval;
}
//-----------------------------------------------------------------------------
int SearchBackWord(char *word,int length,char *anterior,int pos)
{
char cadena[SIZE],salida[SIZE];
char nameFile[13]={0};
char aux;
int a,i,contador,retval;
FILE *archivo;
sprintf(nameFile
,"%i_Letras.txt",length
-1); archivo
=fopen(nameFile
,"r");
if(archivo != NULL){
fseek(archivo
,pos
,SEEK_SET
); do{
retval
=fread(cadena
,SIZE
,1,archivo
); contador=length-1;
for(a=0;a<length;a++){
for(i=0;i<contador;i++){
if(word[a]==cadena[i])
{
aux=cadena[i];
cadena[i]=cadena[contador-1];
cadena[contador-1]=aux;
contador--;
break;
}
}
}
if(contador==0){
}else{
retval=-1;
}
}while(contador
!=0 && !feof(archivo
)); }else{
retval=-2;
}
return retval;
}
//-----------------------------------------------------------------------------
int DelInvalidWordsDesc(char *nameFile,int size,int *nEliminadas)
{
int encontrada,nPalabras,posPalabra,pos=0;
FILE *archivo,*salida;
char palabra[SIZE],siguiente[SIZE],pathSalida[25];
*nEliminadas=0;
archivo
=fopen(nameFile
,"r"); if(archivo != NULL){
sprintf(pathSalida
,"%i_Letras_res.txt",size
); salida
=fopen(pathSalida
,"w+");
if(salida != NULL){
do{
encontrada
=fread(palabra
,SIZE
,1,archivo
); if(encontrada==1){
pos=SearchBackWord(palabra,size,siguiente,pos);
if(pos > -1){
if(SearchRepe(salida,siguiente)==0){
fwrite(palabra
,sizeof(palabra
),1,salida
); }
}else if(pos==-2){
encontrada=-3;
break;
}else{
*nEliminadas +=1;
}
}
}else{
encontrada=-2;
}
}else{
encontrada=-1;
}
return encontrada;
}
int DelInvalidWordsAsc(char *nameFile,int size,int *nEliminadas)
{
int encontrada,nPalabras,posPalabra,pos=0;
FILE *archivo,*salida;
char palabra[SIZE],siguiente[SIZE],pathSalida[25];
*nEliminadas=0;
archivo
=fopen(nameFile
,"r"); if(archivo != NULL){
sprintf(pathSalida
,"%i_Letras_res.txt",size
); salida
=fopen(pathSalida
,"w+");
if(salida != NULL){
do{
encontrada
=fread(palabra
,SIZE
,1,archivo
); if(encontrada==1){
pos=SearchNextWord(palabra,size,siguiente,pos);
if(pos > -1){
if(SearchRepe(salida,siguiente)==0){
fwrite(palabra
,sizeof(palabra
),1,salida
); }
}else if(pos==-2){
encontrada=-3;
break;
}else{
*nEliminadas +=1;
}
}
}else{
encontrada=-2;
}
}else{
encontrada=-1;
}
return encontrada;
}
//-----------------------------------------------------------------------------
int SearchRepe(FILE *archivo,char *palabra)
{
int encontrada=0,retval;
char leida[SIZE];
fseek(archivo
,0,SEEK_SET
); do{
retval
=fread(leida
,sizeof(leida
),1,archivo
); if(retval
==1 && strcmp(leida
,palabra
)==0){ encontrada=1;
break;
}
}while(!feof(archivo
) && encontrada
==0); fseek(archivo
,0,SEEK_END
); return encontrada;
}
La verdad es que si creo los archivos y a su archivo correspondiente le meto una cadena que se que valdrá funciona mi codigo aunque tengo que ir ejecutandolo varias veces hasta obtener que no se borro nada de ningun archivo.
Si pongo cada una de estas en su correspondiente archivo me borra todas las que no se puedan combinar pero estas no las borra porque si que se pueden combinar pero si no meto estas cadenas acaba borrandome todo o casi todo y algunos archivos acaban vacios pero sin embargo al jugar en el juego veo que hay combinaciones validas asi que no deberia borrarlas pero no se que hago mal.