#include <stdio.h>                /*LUIS MANCILLA AVILA*/
#include <string.h>
#define MAX 50
int AREA;/* CONTIENE EL AREA DE LA FIGURA*/
int num_cua;/* CONTIENE EL NUMERO DE CUADRADOS*/
char let_cua1[MAX];/*CONTIENE EL ARREGLO ORIGINAL DEL ORDEN DE LOS CUADRADOS*/
char let_cua[MAX];/* ESTE SALE MODIFICADO POR PANTALLA*/
char figura[MAX][MAX];
void llena_();
int revisa();
void f0();
void recorre(char letra,int x1,int x2,int y1,int y2);
void swap(char letra_enc,char letra);
int I_1(char letra);
int I_2(char letra);
int J_1(char letra);
int J_2(char letra);

void main()
{
  system("clear");
  llena_();
  f0();
  if(revisa()==1)
    return;
  printf("\n");
  printf("Resp: %s\n",let_cua);
  printf("(Puede haber una o varias respuestas)\n");
  printf("Busca orden v.1.0\n");
  return;
}

void llena_()   /* CON ESTA FUNCION LEO EL ARCHIVO*/
{
  int i;
  scanf("%d",&AREA);
  scanf("%d",&num_cua);
  getchar();
  gets(let_cua1);
  strcpy(let_cua,let_cua1);
  puts(let_cua);
  for(i=0;i<AREA;i++)
    gets(figura[i]);
  for(i=0;i<AREA;i++)
    puts(figura[i]);
  return;
}

int revisa() /* FUNCION QUE REVISA EL ARCHIVO POR EL AREA EL NUMERO DE CUADRADOS*/
{
  if(num_cua!=strlen(let_cua))
  {
    printf("La cantidad de cuadrados no coincide con la cantidad de letras de cuadrados\n");
    return(1);
  }
  if(AREA>40)
  {
    printf("Limite maximo de Area:40\n");
    return(1);
  }
  return(0);
}

void f0()       /* CON ESTA FUNCION LEO LAS LETRAS DE CADA CUADRADO QUE PASA POR EL FOR*/
{
  char aux;
  int i,h,k;
  int i_1,i_2,j_1,j_2;
  for(i=0;i<strlen(let_cua1);i++)
  {
    i_1=I_1(let_cua1[i]);
    i_2=I_2(let_cua1[i]);
    j_1=J_1(let_cua1[i]);
    j_2=J_2(let_cua1[i]);
    if( i_1==-1)                 /*si en las funciones me retorna un -1 de error entonces significa que no se encontro el cuadrado
                                   entonces lo dejo como si estuviera encima de todos*/
      for(h=1;h<strlen(let_cua);h++)
        if(let_cua1[i]==let_cua[h])
        {
          for(k=h;k>0;k--)
          {
            aux=let_cua[h];
            let_cua[h]=let_cua[h-1];
            let_cua[h-1]=aux;
          }
          break;
        }
    if( i_2-i_1<1 || j_2-j_1<1 || i_2-i_1>11  || j_2-j_1>11 )
    {
      printf("\nWarning: Error al escribir el cuadrado (%c)\n",let_cua1[i]);
      printf("Tamaņos:\nminimo:2x2\nmaximo:12x12\n");
    }
    recorre(let_cua1[i],i_1,i_2,j_1,j_2);
  }
  return;
}

int I_1(char letra)   /* LE BUSCO A LA LETRA QUE ENTRA A LA FUNCION SU MINIMO I*/
{
  int i,j;
  for(i=0;i<AREA;i++)
    for(j=0;j<AREA;j++)
      if(figura[i][j]==letra)
        return(i);
  return(-1);
}

int I_2(char letra)   /* LE BUSCO A LA LETRA QUE ENTRA A LA FUNCION SU MAXIMO I*/
{
  int i,j;
  for(i=AREA-1;i>-1;i--)
    for(j=0;j<AREA;j++)
      if(figura[i][j]==letra)
        return(i);
  return(-1);
}

int J_1(char letra)   /* LE BUSCO A LA LETRA QUE ENTRA A LA FUNCION SU MINIMO J*/
{
  int i,j;
  for(j=0;j<AREA;j++)
    for(i=0;i<AREA;i++)
      if(figura[i][j]==letra)
        return(j);
  return(-1);
}

int J_2(char letra)    /* LE BUSCO A LA LETRA QUE ENTRA A LA FUNCION SU MAXIMO J*/
{
  int i,j;
  for(j=AREA-1;j>-1;j--)
    for(i=0;i<AREA;i++)
      if(figura[i][j]==letra)
        return(j);
  return(-1);
}

void recorre(char letra,int x1,int x2,int y1,int y2)   /*RECORRE A PARTIR DE LAS COORDENADAS QUE ENCUENTRO*/
{
  int h,k,i=0;
  int flag=0;
  char aux;
  for(h=x1;h<x2+1;h++)
    if(figura[h][y1]!=letra && figura[h][y1]!=' ')
    {
      swap(figura[h][y1],letra);
      flag=1;
    }
  for(h=x1;h<x2+1;h++)
    if(figura[h][y2]!=letra && figura[h][y2]!=' ')
    {
      swap(figura[h][y2],letra);
      flag=1;
    }
  for(k=y1;k<y2+1;k++)
    if(figura[x1][k]!=letra && figura[x1][k]!=' ')
    {
      swap(figura[x1][k],letra);
      flag=1;
    }
  for(k=y1;k<y2+1;k++)
    if(figura[x2][k]!=letra && figura[x2][k]!=' ')
    {
      swap(figura[x2][k],letra);
      flag=1;
    }
  if(flag==0)                        /*EN ESTA PARTE SI EL CUADRADO DE LA LETRA QUE VOY RECORRIENDO
                                       ESTA COMPLETO, ENTONCES LA DEJO AL ULTIMO*/
    for(i=0;i<strlen(let_cua)-1;i++)
      if(let_cua[i]==letra)
      {
        aux=let_cua[i];
        let_cua[i]=let_cua[i+1];
        let_cua[i+1]=aux;
      }
  return;
}

void swap(char letra_enc,char letra)   /*HACE UN CAMBIO ENTRE LA LETRA QUE ESTA ENCIMA CON LA LETRA QUE ESTOY RECORRIENDO*/
{
  int i,j;
  int aux;
  for(i=0;i<strlen(let_cua);i++)
    if(let_cua[i]==letra_enc)
      for(j=0;j<strlen(let_cua);j++)
        if(let_cua[j]==letra)
          if(i<j)
          {
            aux=let_cua[i];
            let_cua[i]=let_cua[j];
            let_cua[j]=aux;
            return;
          }
}
