|
|
/**
|
|
|
* SAE 2.02 - Exploration algorithmique d’un 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;
|
|
|
}
|