Untitled

 avatar
user_9243973
plain_text
2 years ago
11 kB
3
Indexable
Never
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#include <dos.h>
#include <dir.h>

//déclaration de la Pile
typedef int Telm;
typedef struct EPile* Pile;
typedef struct EPile { Telm  Val; Pile Suiv} CelluleP;

//déclaration de la File
typedef struct Element* EFile;
typedef struct Element { Telm  Val; EFile Suiv} CelluleF;
typedef struct {EFile Tete,Queue;} File;

//primitives des Piles
//procedure Initpile
void Initpile(Pile *P)
{(*P)=NULL;}

//procedure Empiler
void Empiler(Pile *P, Telm x)
{Pile V;
 V=malloc(sizeof(CelluleP));
 V->Val=x;
 V->Suiv=*P;
 *P=V;
}

//procedure Depiler
void Depiler(Pile *P, Telm *x)
{Pile V;
 *x=(*P)->Val;
 V=*P;
 *P=(*P)->Suiv;
 free(V);
}

//Fonction Pilevide
int Pilevide(Pile P)
{if (P==NULL) return 1;
 else return 0;
}

//Fonction SommetPile
Telm SommetPile(Pile P)
{return P->Val;}

////primitives des Files
//procedure Initfile
void Initfile(File *F)
{(*F).Tete=NULL; (*F).Queue=NULL;}

//procedure Enfiler
void Enfiler(File *F, Telm x)
{EFile V;
 V=malloc(sizeof(CelluleF));
 V->Val=x;
 V->Suiv=NULL;
 if ((*F).Tete==NULL) (*F).Tete=V; //la file est vide
 else (*F).Queue->Suiv=V;
 (*F).Queue=V;
}

//procedure Defiler
void Defiler(File *F, Telm *x)
{EFile V;
 V=(*F).Tete;
 *x=V->Val; //ou  *x=(*F).Tete->Val;
 if ((*F).Tete==(*F).Queue) {(*F).Tete=NULL; (*F).Queue=NULL;}
 else (*F).Tete=(*F).Tete->Suiv; // ou  (*F).Tete=V->Suiv;
 free(V);
}

//Fonction Filevide
int Filevide(File F)
{if (F.Tete==NULL) return 1;
 else return 0;
}

//Fonction Tetefile
Telm Tetefile(File F)
{return F.Tete->Val;}
typedef struct Liste*Pliste;
typedef struct Liste{int x;int y;int nature;Pliste Suiv;}Cellule;
int n,m,k1,k2; int T[100][100];
Pliste Tete;

//Creation
void creercarte(int T[][100],int n,int m)
{
    int i,j,r;
    srand(time(NULL));

  for(i=0;i<n;i=i+2)         //on avance de deux pas pour travailler que par paire
  {
        for (j=0;j<m;j=j+2)
        {
            r=(rand()%4)+1;   // rand%4 veut dire qu'on remplie avec des 0 1 2 3 on rajoute
            T[i][j]=r;        //+1 pour remplir avec 1 2 3 4 seulement
            T[i][j+1]=r;
            T[i+1][j]=r;     //on remplie aleatoirement 4 pixels voisin en meme temps et vu que cest
            T[i+1][j+1]=r;    //aleatoire on a au minimum des objets de 4 sinon plus que 4
        }
  }
}
//Affichage
void affichecarte(int T[][100])
{
    int i,j;

  for (i=0;i<n+2;i++)  //pour delimiter la carte : la premiere ligne de_
  {
      printf("_");
  }


  for(i=0;i<n;i++)
  {
      printf("\n");
      printf("|");
       for (j=0;j<m;j++)
        {
            if(T[i][j]==1){SetColor(1);}
            if(T[i][j]==2){SetColor(4);}  //pour que chaque nature ait sa propre couleur
            if(T[i][j]==3){SetColor(6);}  //on appelle la fonction des couleurs
            if(T[i][j]==4){SetColor(2);}

            printf("%d",T[i][j]);
        }
        SetColor(15);  //(le 15 la couleur du blanc) pour quil n'y ait que les chiffres en couleurs et non les |
      printf("|");
  }
  printf("\n");


  for (i=0;i<n+2;i++)  // la derniere ligne de _
  {
      printf("_");
  }
}

//la fonction pour les couleurs
void SetColor(int ForgC)
 {
 WORD wColor;

  HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  CONSOLE_SCREEN_BUFFER_INFO csbi;

                       //We use csbi for the wAttributes word.
 if(GetConsoleScreenBufferInfo(hStdOut, &csbi))
 {
                 //Mask out all but the background attribute, and add in the forgournd color
      wColor = (csbi.wAttributes & 0xF0) + (ForgC & 0x0F);
      SetConsoleTextAttribute(hStdOut, wColor);
 }
 return;
}

/*void ExtraireObjet(int T[][100],int i,int j,int n,int m,int nature)
{

       if (T[i][j]==nature) {T[i][j]=9; printf("(%d %d)\n",i,j);

        if (j>0){ ExtraireObjet(T,i,j-1,n,m,nature);} //case gauche
        if (i>0){ ExtraireObjet(T,i-1,j,n,m,nature);}// case haut
        if (i<n-1){ExtraireObjet(T,i+1,j,n,m,nature);}//bas
        if (j<m-1){ExtraireObjet(T,i,j+1,n,m,nature);}//droite
        printf("nb de parcelles\n");
    }
}
typedef struct Liste*Pliste;
typedef struct Liste{int val1;int val2;Pliste Suiv;}Cellule;
void ExtraireObjet(int T[][100],int i,int j,int n,int m,int nature,Pliste P)
{
      Pliste Q,B,R,Tete;
      int Pi,Pj,Ti,Tj;
       if (T[i][j]==nature) {
            T[i][j]=9;
            printf("(%d %d)\n",i,j);
            P=malloc(sizeof(Cellule)); P->val1=i;P->val2=j;
            if(i<=Ti && j<=Tj){P->Suiv=Tete;Tete=P;Ti=i;Tj=j;Q=Tete->Suiv;B=P;}
                else {if (i<=Ti) {P->Suiv=Q;B->Suiv=P;B=P;}
                /*else {if(j<=Ti) {if(i>=Pi) && (j>=Pj) {R=Q;R->Suiv=P;P->Suiv=NULL;P=Q;Pi=i;Pj=j;}}
                       else{if(j<Pj){P->Suiv=Q;R->Suiv=P;P=Q;Pi=i;Pj=j;}}}
                else {if(i>=Pi && j>=Pj) {R=Q;R->Suiv=P;P->Suiv=NULL;P=Q;Pi=i;Pj=j;}
                       else{if(j<Pj){P->Suiv=Q;R->Suiv=P;P=Q;Pi=i;Pj=j;}}}}

        if (j>0){ ExtraireObjet(T,i,j-1,n,m,nature,P);} //case gauche
        if (i>0){ ExtraireObjet(T,i-1,j,n,m,nature,P);}// case haut
        if (i<n-1){ExtraireObjet(T,i+1,j,n,m,nature,P);}//bas
        if (j<m-1){ExtraireObjet(T,i,j+1,n,m,nature,P);}//droite
         //printf("nb de parcelles\n");
    }

}*/

/*int ExtraireObjet(int T[][100],int i,int j,int n,int m,int nature,Pliste Tete)
{
      Pliste P,Q;
      int A,B;
       if (T[i][j]==nature)
          {
                T[i][j]=9;

                if (j>0){ ExtraireObjet(T,i,j-1,n,m,nature,Tete);} //case gauche
                if (i>0){ ExtraireObjet(T,i-1,j,n,m,nature,Tete);}// case haut
                if (i<n-1){ExtraireObjet(T,i+1,j,n,m,nature,Tete);}//bas
                if (j<m-1){ExtraireObjet(T,i,j+1,n,m,nature,Tete);}//droite

                P=malloc(sizeof(Cellule));
                P->x=i; P->y=j;
                P->Suiv=Tete; Tete=P;

                afficheliste(Tete);
          }

}
*/
void afficheliste(Pliste Tete)
{
    Pliste P;
    P=Tete;
    while(P!=NULL)
    {
        printf("(%d %d)",P->x,P->y);P=P->Suiv;
    }


}
void triliste(Pliste *Tete)
{
   Pliste Q,P;
   int A,B;
   P=*Tete;
   while(P->Suiv!=NULL)
    {
        Q=P->Suiv;
        while(Q!=NULL)
        {
            if (P->x >= Q->x) { A=P->x; B=P->y; P->x=Q->x; P->y=Q->y; Q->x=A; Q->y=B; };
            if (P->x == Q->x && P->y >= Q->y) { A=P->x; B=P->y; P->x=Q->x; P->y=Q->y; Q->x=A; Q->y=B; };

            Q=Q->Suiv;
        }
        P=P->Suiv;
    }
}
Pliste ExtraireObjet(int T[][100],int i,int j,int n,int m,int nature)
{
      Pliste P,Q;
      int A,B;;

       if (T[i][j]==nature)

          {
                T[i][j]=9; k1=k1+1;
                if (j>0)  { ExtraireObjet(T,i,j-1,n,m,nature);} //case gauche
                if (i>0)  { ExtraireObjet(T,i-1,j,n,m,nature);}// case haut
                if (i<n-1){ExtraireObjet(T,i+1,j,n,m,nature);}//bas
                if (j<m-1){ExtraireObjet(T,i,j+1,n,m,nature);}//droite

                P=malloc(sizeof(Cellule));
                P->x=i; P->y=j;
                P->nature = nature;
                P->Suiv=Tete; Tete=P;
                k2=k2+1;k1=k1-1;




          }
         if(k1==0 && k2>0){triliste(&Tete);}

          return (Tete);


}
void AfficheObjet(int T[][100],int i,int j,int n,int m,int nature)
{
    Pliste P;
    P= ExtraireObjet(T,i,j,n,m,nature);
    printf("\n\n");

     for(int a=0; a<n+2;a++)  //pour delimiter la carte : la premiere ligne de_
  {
      printf("_");
  }
    for(int a=0; a<n;a++)
    {

        printf("\n");
        printf("|");
        for(int b=0;b<m;b++)
        {
            if(P!= NULL)
            {
            if(P->nature==1){SetColor(1);}
            if(P->nature==2){SetColor(4);}  //pour que chaque nature ait sa propre couleur
            if(P->nature==3){SetColor(6);}  //on appelle la fonction des couleurs
            if(P->nature==4){SetColor(2);}
                if(a==P->x && b==P->y)
                {
                    printf("%c",219);
                    P=P->Suiv;
                }
                else
                {
                    SetColor(15);
                    printf(" ");
                }
            }
            else
            {
                SetColor(15);
                printf(" ");
            }
        }
            SetColor(15);  //(le 15 la couleur du blanc) pour quil n'y ait que les chiffres en couleurs et non les |
            printf("|");
    }
    printf("\n");
for(int a=0; a<n+2;a++)  //pour delimiter la carte : la premiere ligne de_
  {
      printf("_");
  }
}
void ExtraireTheme(int T[][100], int n , int m, int nature, File *F)
{
    int i,j;
    Initfile(&(*F));
    Pliste P;
    for (i=0;i<n;i++)
        for (j=0;j<m;j++)
    {
        if (T[i][j]==nature)
        {
            P=ExtraireObjet(T,i,j,n,m,nature);
            printf("\n done \n");
            Enfiler(&(*F),P);
        }
    }
}

void AfficheTheme(File F)
{
    int Th[n][m];
    for (int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            Th[i][j]=0;
    while(!Filevide(F))
    {
        Pliste Tth;
        Defiler(&F,Tth);
        while(Tth!=NULL)
        {
            Th[Tth->x][Tth->y]==Tth->nature;
            Tth=Tth->Suiv;
        }
    }
        int i,j;

  for (i=0;i<n+2;i++)  //pour delimiter la carte : la premiere ligne de_
  {
      printf("_");
  }


  for(i=0;i<n;i++)
  {
      printf("\n");
      printf("|");
       for (j=0;j<m;j++)
        {
            if(Th[i][j]==0)
                printf(" ");
            else
            {
                if(Th[i][j]==1){SetColor(1);}
                if(Th[i][j]==2){SetColor(4);}  //pour que chaque nature ait sa propre couleur
                if(Th[i][j]==3){SetColor(6);}  //on appelle la fonction des couleurs
                if(Th[i][j]==4){SetColor(2);}

                printf("%c",219);
            }
        }
        SetColor(15);  //(le 15 la couleur du blanc) pour quil n'y ait que les chiffres en couleurs et non les |
      printf("|");
  }
  printf("\n");


  for (i=0;i<n+2;i++)  // la derniere ligne de _
  {
      printf("_");
  }
}


int main()
{  int i,j,nature;
   Pliste P;
   k1=0;k2=0;


    printf("veuillez entrer les dimensions de votre carte \n");
    printf("la longueur:");
    scanf("%d",&n);
    printf("la largeur:");
    scanf("%d",&m);
    printf("la carte : \n");
    creercarte(T,n,m);
    affichecarte(T);
    printf("\nentrez les coordonnees i et j: ");
    scanf("%d",&i); scanf("%d",&j);
    printf("entrez la nature de la parcelle: ");
    scanf("%d",&nature);
    Tete=NULL;
    AfficheObjet(T,i,j,n,m,nature);
    File F;
    ExtraireTheme(T,n,m,nature,&F);
    AfficheTheme(F);



    return 0;
}