2
« en: Domingo 20 de Febrero de 2005, 21:27 »
Bueno, aqui va mi solución, a ver qué os parece....
Las órdenes van en el fichero orden.txt (podeis copiar las del ejemplo).
#include <stdio.h>
#include <string.h>
void posicion(short array[][25], short bloque, short* fila, short* columna)
{
// devuelve la posición (en el array) en la que se encuentra un bloque
int i,j=-1;
for(i=0; i<25; i++, j=-1)
{
while(array[++j] != -1)
{
if (array[j] == bloque)
{
*fila=i;
*columna=j;
break;
}
}
if (array[j] == bloque) break;
}
}
void limpia(short array[][25], short fila, short columna)
{
// devuelve los bloques de encima a sus posiciones originales
short bloque;
while((bloque=array[fila][++columna]) != -1)
{
array[bloque][0]=bloque; // ponerlo en la posicion inicial
array[bloque][1]=-1; // fin de la pila
}
}
void main(void)
{
FILE *fichero;
short array[25][25];
short i, j, num_bloques=10, origen, destino, fila_o, col_o, fila_d, col_d;
char orden_1[6], orden_2[6];
//inicializo el array
for (i=0; i<25; i++)
{
for (j=0; j<25; j++)
array[j]=0;
}
for (i=0; i<25; i++)
{
array[0]=i;
array[1]=-1; // con -1 indicamos fin de pila
}
//lectura de órdenes y ejecución
fichero=fopen("orden.txt", "r");
if (fichero != NULL)
{
fscanf(fichero,"%d", &num_bloques);
while ((fscanf(fichero,"%s %d %s %d", orden_1, &origen, orden_2, &destino)) == 4)
{
posicion(array, origen, &fila_o, &col_o);
posicion(array, destino, &fila_d, &col_d);
if (origen == destino || fila_o == fila_d)
{
// printf("\nOrden incorrecta, origen y destino no pueden coincidir.");
}
else if (strcmp(orden_1,"move") == 0 && strcmp(orden_2,"onto") == 0)
{
limpia(array,fila_o, col_o);
limpia(array,fila_d, col_d);
array[fila_d][col_d + 1]=array[fila_o][col_o];// lo movemos
array[fila_d][col_d + 2]=-1; // indicamos fin de pila
array[fila_o][col_o]=-1; // indicamos fin de pila en el origen
}
else if (strcmp(orden_1,"move") == 0 && strcmp(orden_2,"over") == 0)
{
limpia(array,fila_o, col_o);
for (i=0;array[fila_d]!=-1;i++);
array[fila_d]=array[fila_o][col_o];// movemos el bloque
array[fila_d][++i]=-1;// fin de pila en el destino
array[fila_o][col_o]=-1; // indicamos fin de pila en el origen
}
else if (strcmp(orden_1,"pile") == 0 && strcmp(orden_2,"onto") == 0)
{
limpia(array,fila_d, col_d);
i=0;
while(array[fila_o][col_o + i] != -1)
{
array[fila_d][col_d + i + 1]=array[fila_o][col_o + i];
i++;
}
array[fila_d][col_d + i + 1]=-1; // indicamos fin de pila en el destino
array[fila_o][col_o]=-1; // indicamos fin de pila en el origen
}
else if (strcmp(orden_1,"pile") == 0 && strcmp(orden_2,"over") == 0)
{
for(j=0; array[fila_d][j]!=-1; j++); //localizamos el final
i=0;
while(array[fila_o][col_o + i] != -1)
{
array[fila_d][j + i]=array[fila_o][col_o + i];
i++;
}
array[fila_d][j + i]=-1; // indicamos fin de pila en el destino
array[fila_o][col_o]=-1; // indicamos fin de pila en el origen
}
else
{
// printf("\nComando incorrecto.\n");
}
}
fclose(fichero);
}
else
{
perror("Error al abrir el fichero");
}
//rutina de impresión
for (i=0; i<num_bloques; i++)
{
printf("\n%d:",i);
j=0;
while (array[j] != -1)
{
printf(" %d", array[j++]);
}
}
printf("\n");
}