#include <stdio.h>
#include <tdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/times.h>
#include "nodos.h"
#include "estado.h"
#include "operadores.h"
#include "busqueda.h"
#include "puzzle.h"
int nFilas, nColumnas;
void tratarArgumentos(int argc, char** argv, int* pnumAlg, int* pnumHeur)
{
if (argc < 3)
*pnumAlg = 1;
*pnumHeur = 0;
else
*pnumAlg = atoi(argv[1]);
*pnumHeur = atoi(argv[2]);
}
void leerEstadosIF(estado** peinicial, estado** pefinal)
{
int f,c;
FILE* fich;
estado *pe1,*pe2;
/* Estado Inicial */
fich = fopen("inicial","r");
fscanf(fich,"%dx%d",&nFilas,&nColumnas);
pe1 = *peinicial = crearEstado();
for (f=0; f < nFilas; f++)
for (c=0; c < nColumnas; c++)
{
fscanf(fich,"%d",&(pe1->tablero[f][c]));
if (pe1->tablero[f][c] == VALOR_ESPACIO_BLANCO)
{
pe1->filaEspacioBlanco = f;
pe1->colEspacioBlanco = c;
}
}
fclose(fich);
/* Estado Final */
fich = fopen("final","r");
fscanf(fich,"%dx%d",&nFilas,&nColumnas);
pe2 = *pefinal = crearEstado();
for (f=0; f < nFilas; f++)
for (c=0; c < nColumnas; c++)
{
fscanf(fich,"%d",&(pe2-tablero[f][c]));
if (pe2->tablero[f][c] == VALOR_ESPACIO_BLANCO)
{
pe2->filaEspacioBlanco = f;
pe2->colEspacioBlanco = c;
}
}
fclose(fich);
}
void escribirPaso(movimiento m, FILE *fich)
{
int direccion;
switch (m)
{
case NORTE:
direccion = 'N';
break;
case SUR:
direccion = 'S';
break;
case ESTE:
direccion = 'E';
break;
case OESTE:
direccion = 'O';
break;
default:
printf("Movimiento no valido\n");
direccion = '?';
break;
}
fprintf(fich,"%c\n",direccion);
}
int calcular(estado e)
{
int f,c,ff,cc;
int valor=0;
for (f=0; f < nFilas; f++)
for (c=0; c < nColumnas; c++)
for (ff=f; ff < nFilas; ff++)
for (cc = (f==ff) ? c+1 : 0; cc < nColumnas; cc++)
if (e.tablero[f][c] e.tablero[ff][cc])
valor++;
if ((e.filaEspacioBlanco + e.colEspacioBlanco) % 2)
valor++;
return valor;
}
bool problemaResoluble(estado e1, estado e2)
{
int valorE1, valorE2;
e1.tablero[e1.filaEspacioBlanco][e1.colEspacioBlanco] = nFilas*nColumnas;
valorE1 = calcular(e1);
e1.tablero[e1.filaEspacioBlanco][e1.colEspacioBlanco] = VALOR_ESPACIO_BLANCO;
e2.tablero[e2.filaEspacioBlanco][e2.colEspacioBlanco] = nFilas*nColumnas;
valorE2 = calcular(e2);
e2.tablero[e2.filaEspacioBlanco][e2.colEspacioBlanco] = VALOR_ESPACIO_BLANCO;
return !((valorE1+valorE2) % 2);
}
int main(int argc, char** argv)
{
estado *peInicial,*peFinal;
int nAlg, nHeur;
tratarArgumentos(argc,argv, &nAlg, &nHeur);
leerEstadosIF(&peInicial,&peFinal);
if (problemaResoluble(*peInicial,*peFinal))
{
int i, nodosTotales;
resultadoBusqueda res;
FILE *fmovs,*fdatosGenerales;
struct tms tms;
float penetracion; /* L / T */
res = busqueda(*peInicial, *peFinal, nAlg, nHeur);
fmovs = fopen("solucion","w");
for (i=0; i < res.numMovs; i++)
escribirPaso(res.movs[i],fmovs);
fclose(fmovs);
nodosTotales = res.nodosGenerados + res.nodosRepetidos;
penetracion = (nodosTotales) ? (res.numMovs / (float) nodosTotales) : 1;
fdatosGenerales = fopen("generales","w");
fprintf(fdatosGenerales,"%d\n%d\n%d\n%d\n%d\n%.3f\n",
nodosTotales,
res.nodosGenerados,
res.nodosRepetidos,
res.maxProfundidad,
res.numMovs);
times(&tms);
fprintf(fdatosGenerales,"%.3f seg\n",tms.tms_utime / (float)CLK_TCK);
fclose(fdatosGenerales);
return 0;
}
else
{
printf("Estados pertenecientes a configuraciones disjuntas") ;
return 1;
}
}
De vuelta al seudocódigo.