You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
SAE-2.02/code/p1e4.c

123 lines
2.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/**
* SAE 2.02 - Exploration algorithmique dun problème
* Prtie 1 / Exercice 4
* Extrait code C
*/
#define NAME_MAX_LEN 40
#define NB_PTS_CARACT_MAX 10
typedef struct pointCaracteristique {
char nom[NAME_MAX_LEN];
struct pointCaracteristique **tPtsCaract;
int nbPtsCaract;
} PointCaracteristique, *Rue;
PointCaracteristique *reseau[NB_PTS_CARACT_MAX];
// BUT: Savoir si B est directement accessible depuis A
int isAccessDirect(PointCaracteristique *A, PointCaracteristique *B)
{
for (int i = 0; i < A->nbPtsCaract; i++)
{
if (A->tPtsCaract[i] == B)
{
return 1;
}
}
return 0;
}
// BUT: Savoir si B est accessible depuis A
// version recusrive
int isAccessREC(PointCaracteristique *A, PointCaracteristique *B)
{
for (int i = 0; i < A->nbPtsCaract; i++)
{
if (isAccessDirect(A, B))
{
return 1;
}
else if (isAccessREC(A->tPtsCaract[i], B))
{
return 1;
}
}
return 0;
}
// version iterative (ebauche de travail)
int isAccessITE(PointCaracteristique *A, PointCaracteristique *B)
{
int i = 0;
PointCaracteristique *ptsMarque[NB_PTS_CARACT_MAX];
int nbPtsMarque = 0;
PointCaracteristique *ptsTest = A;
// pour tout les points du point teste
for (i = 0; i < ptsTest->nbPtsCaract; i++)
{
// test si point deja teste
for (int j = 0; j < nbPtsMarque; j++)
{
if (ptsTest == ptsMarque[j])
{
break;
}
}
// test si pour ce point le chemin est direct
if (isAccessDirect(ptsTest, B))
{
return 1;
}
// le point viens d etre teste, il entre dans la liste
ptsMarque[nbPtsMarque++] = ptsTest;
// on teste ensuite le prochain
ptsTest = ptsTest->tPtsCaract[i];
}
return 0;
}
int isInTab(PointCaracteristique *P, PointCaracteristique **TabP, int lenTabP)
{
for (int i; i < lenTabP; i++)
{
if (TabP[i] == P)
{
return 1;
}
}
return 0;
}
// version rapide
int isAccess(PointCaracteristique *A, PointCaracteristique *B, PointCaracteristique **ptsMarque, int *nbPtsMarque)
{
for (int i = 0; i < A->nbPtsCaract; i++)
{
if (! isInTab(A, ptsMarque, *nbPtsMarque))
{
ptsMarque[*nbPtsMarque++] = A;
if (isAccessDirect(A, B))
{
return 1;
}
else if (isAccess(A->tPtsCaract[i], B, ptsMarque, nbPtsMarque))
{
return 1;
}
}
}
return 0;
}