#include <stdio.h>
#include <string.h>
#define N 40

void pos_der_abajo(char letra,char matriz[N][N],int *i,int *j);
void pos_izq_arriba(char letra,char matriz[N][N],int *i,int *j);
void recorrer_matriz(char matriz[N][N],int i_final,int i_inicial,int j_final,int j_inicial,char letra);
void eliminar(char letra);

char orden[9];

main()
{
	int i=0,area,num_var,flag=0,j,der_abajo_i,izq_arriba_i,der_abajo_j,izq_arriba_j;
	char variables[9],matriz[N][N],var;
	for (i=0;i<9;i++)
		orden[i] = ' ';
	scanf("%d",&area);        /* calcula el largo de la matriz*/
	scanf("%d",&num_var);     /*calcula los elementos de la matriz*/
	getchar();
	gets(variables);          /*lee las variables es decir la cantidad de rectangulos*/
	for (i=0;variables[i]!='\0';i++)
		orden[i]=variables[i];
	printf("orden = %s",orden);
	for (i=0;i<N;i++)
		for (j=0;j<N;j++)             /*llena la matriz de espacios*/
			matriz[i][j]=' ';
	for (i=0;i<N;i++)
	{
		for (j=0;j<N;j++)               /*lee los rectangulos es decir las variables*/
		{
			var = getchar();
			if (var!='\n')
				if (var==EOF)
				{
					flag=1;
					break;
				}
				else
					matriz[i][j] = var;
			else
				break;
		}
		if (flag == 1)
			break;
	}
	for (i=0;i<N;i++)                   /*imprime la matriz*/
	{
		printf("\n");
		for (j=0;j<N;j++)
			printf("%c",matriz[i][j]);
	}
	i=0;
	while(variables[i]!='\0')
	{
		pos_der_abajo(variables[i],matriz,&der_abajo_i,&der_abajo_j);      /*funcion que buscan el punto final de el rectangulo*/
		pos_izq_arriba(variables[i],matriz,&izq_arriba_i,&izq_arriba_j);  /*funcion que busca el punto inicial del rectangulo*/   
		printf("\nder_abajo_i = %d, der_abajo_j = %d",der_abajo_i,der_abajo_j);
		printf("\nizq_arriba_i = %d, izq_arriba_j = %d",izq_arriba_i,izq_arriba_j);
		if(der_abajo_i != -1) 
			recorrer_matriz(matriz,der_abajo_i,izq_arriba_i,der_abajo_j,izq_arriba_j,variables[i]); /*si no encuentra la variable buscada entonces retorna -1*/
		else
		{
			eliminar(variables[i]);        /*como retorno -1 entonces se pone al principio de la matriz orden*/
			for(j=7;j>0;j--)
			{
				orden[j]=orden[j-1];
				orden[j-1]=variables[i];
			}
		} 
		i++;  
	} 
	printf("\nEl orden es : ");
	for(i=0;i<8;i++)
		printf("%c",orden[i]);  
	return 0;
}

void pos_der_abajo(char letra,char matriz[N][N],int *i,int *j)/*funcion que encuentra la posicion del punto final del rectangulo*/
{
	int aux_i=-1,aux_j=-1,x,y;
	for(x=0;x<N;x++)
		for(y=0;y<N;y++)
			if (letra == matriz[x][y])
			{
				if (x > aux_i)
					aux_i=x;
				if (y > aux_j)
					aux_j=y;
			}
	if (aux_i==-1)
	{
		*i=-1;
		*j=-1;
	}
	else
	{
		*i=aux_i;
		*j=aux_j;
	}
	return;
}

void pos_izq_arriba(char letra,char matriz[N][N],int *i,int *j)/*funcion que muestra la posicion inicial del rectangulo*/
{
	int aux_i=N,aux_j=N,x,y;
	for(x=0;x<N;x++)
		for(y=0;y<N;y++)
			if (letra == matriz[x][y])
			{
				if (x < aux_i)
					aux_i=x;
				if (y < aux_j)
					aux_j=y;
			}
	if (aux_i==N)
	{
		*i=-1;
		*j=-1;
	}
	else
	{
		*i=aux_i;
		*j=aux_j;
	}
	return;
}

void recorrer_matriz(char matriz[N][N],int i_final,int i_inicial,int j_final,int j_inicial,char letra)
{
	int x,y,j;
	for(x=i_inicial;x<=i_final;x++)
		if (x==i_inicial || x==i_final) /*funcion que toma una variable y enpiesa a recorrer la matriz de rectangulos y cuando encuentra una que sea diferente de la variable la pone adelante  de la varible es decir la  ordena */ 
		{
			for(y=j_inicial;y<=j_final;y++)
				if (letra!=matriz[x][y])
				{
					eliminar(matriz[x][y]);
					for(j=7;orden[j-1]!=letra;j--)
					{
						orden[j]=orden[j-1];
						orden[j-1]=matriz[x][y];
					}
				}
		}
		else
		{
			if (letra!=matriz[x][j_inicial])
			{
				eliminar(matriz[x][j_inicial]);
				for(j=7;orden[j-1]!=letra;j--)
				{
					orden[j]=orden[j-1];
					orden[j-1]=matriz[x][j_inicial];
				}
			}
			if (letra!=matriz[x][j_final])
			{
				eliminar(matriz[x][j_final]);
				for(j=7;orden[j-1]!=letra;j--)
				{
					orden[j]=orden[j-1];
					orden[j-1]=matriz[x][j_final];
				}
			}
		}
	return;
}

void eliminar(char letra)/*funcion que elimina la letra encontrada y corre todas una posicion hacia adelante*/
{
	int i,j=7;
	char aux;
	for (i=0;i<8;i++)
		if (orden[i]==letra)
		{
			for(j=i;j<7;j++)
			{
				aux=orden[j];
				orden[j]=orden[j+1];
				orden[j+1]=aux;
			}
			orden[j]=' ';
		}
	return;
}
