Gros probleme labyrinthe , boucle infini

Le
Angelus
voila mon code source pour générer alléatoirement un labyrinthe :

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void initialisation (int,int);
void liberer2d(int***,int);
void propager4(int ,int ,int,int,int ,int**);
void propager(int ,int ,int,int,int,int**);
int **allouer2d(int ,int);
void afficher(int,int, int**);
void Pcc(int,int,int,int,int,int**);
void compte_casezero(int, int , int ,int**);

int main (void){
srand(time(NULL));
initialisation(7,8);
return 0;
}

void initialisation (int n, int m){
int k,i,j,nbcaseAzero,x,y,d,maxl,maxh,stockvaleur;
int **laby;
maxl=2*n+1;
maxh=2*m+1;
laby=allouer2d(maxl,maxh);
nbcaseAzero=n*m;
k=0;
for (i=0;i<maxl;i++){
for (j=0;j<maxh; j++){
if ((i%2!=0) && j%2!=0){
laby[i][j]=k++;
}
else laby[i][j]=-1;
}
}
afficher (maxh , maxl, laby);
while (nbcaseAzero>0){
x=(rand()%(maxl-2)) + 1;
y=(rand() %(maxh-2)) + 1;
while ((x&1)==(y&1)){
x=(rand()%(maxl-2)) + 1;
y=(rand() %(maxh-2)) + 1;
}
if (x&1){
d=laby[x][y-1]-laby[x][y+1];
if (d>0) {
laby[x][y]=laby[x][y+1];
stockvaleur=laby[x][y+1];
propager4(x,(y-1),laby[x][y+1], stockvaleur,nbcaseAzero,laby);
compte_casezero(nbcaseAzero,maxh,maxl,laby);
}
else if (d<0){
laby[x][y]=laby[x][y-1];
stockvaleur=laby[x][y-1];
propager4(x,(y+1),laby[x][y-1], stockvaleur,nbcaseAzero,laby);
compte_casezero(nbcaseAzero,maxh,maxl,laby);
afficher (maxh , maxl, laby);
}
}
else if (y&1){
d=laby[x-1][y]-laby[x+1][x];
if (d>0) {
laby[x][y]=laby[x+1][y];
stockvaleur=laby[x+1][y];
propager4((x-1),y,laby[x+1][y], stockvaleur,nbcaseAzero,laby);
compte_casezero(nbcaseAzero,maxh,maxl,laby);
}
else if (d<0){
laby[x][y]=laby[x-1][y];
stockvaleur=laby[x-1][y];
propager4((x+1),y,laby[x-1][y], stockvaleur,nbcaseAzero,laby);
compte_casezero(nbcaseAzero,maxh,maxl,laby);
}
}
}
afficher (maxh , maxl, laby);
}

int **allouer2d(int l,int h){
int i, **t;
t=malloc(h*sizeof*t);
assert(t);
for (i=0;i<h;i++){
t[i]=malloc (l*sizeof*t[i]);
assert (t[i]);
}
return t;
}


void liberer2d(int*** q,int h){
int i;
for (i=0;i<h;i++)
free(*q);
*q=NULL;
}
void propager(int x,int y,int nouvelvaleur,int ancienvaleur,int nb,int
**matrice) {
if (nb==0) exit(0);
if(matrice[x][y]!=ancienvaleur) return;
matrice[x][y]=nouvelvaleur;
}

void propager4(int x,int y,int nouvelvaleur,int ancienvaleur, int
nb ,int **matrice){
propager((x+1),y,nouvelvaleur,ancienvaleur,nb,matrice);
propager((x-1),y,nouvelvaleur,ancienvaleur,nb,matrice);
propager(x,(y+1),nouvelvaleur,ancienvaleur,nb,matrice);
propager(x,(y-1),nouvelvaleur,ancienvaleur,nb,matrice);
}

/*fonction propagerfait ms gro pb*/
/*fonction calcule chemin*/
/*fonction affiche chemin*/
/*fonction copie labyrinthe*/


void afficher(int l, int h,int **pointeur){
int i,j;
for (i=0; i<h;i++){
for (j=0; j<l; j++){
printf ("%3d",pointeur[i][j]);
}
printf("");
}
printf("");
}

void Pcc(int x1,int y1,int x2,int y2,int v,int **L){
v=v+1;
L[x1][y1]=v;
if(x1==x2&&y1==y2) return;
if (v < L[x1+1][y1] || L[x1+1][y1] == 0)
Pcc(x1, y1+1, x2, y2, v,L);
if (v < L[x1-1][y1] || L[x1-1][y1] == 0)
Pcc(x1, y1-1, x2, y2, v,L);
if (v < L[x1][y1+1] || L[x1][y1+1] == 0)
Pcc(x1+1, y1, x2, y2, v,L);
if (v < L[x1][y1-1] || L[x1][y1-1] == 0)
Pcc(x1-1, y1, x2, y2, v,L);
}

void compte_casezero(int m, int l, int h,int **matrice){
int i,j;
for (i=0;i<h;i++)
for (j=0; j<l; j++)
if (matrice[i][j]==0 && (i&1) && (j&1))
m--;
printf("%d",m);

}


voila , il se trouve que je ne sais vraiment pas pourquoi ma fonction
est infini, je pense que c'est a cause du return dans ma fonction
propager , mais je n'en sui pas sur, je suis blocker à cette fonction
depuis 3 jour.
Svp aidez moi , j'utilise cette algo pour générer mon labyrinthe.

http://209.85.135.104/search?q=cache:KqVCk5OegmQJ:www.ai.univ-paris8.fr/~=
amsi/SD0607S1/supports/cours07.pdf+Le+plus+court+chemin+dans+un+labyrinthe&=
hl=fr&ct=clnk&cd=9&gl=fr
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Pascal Bourguignon
Le #994746
Angelus
voila mon code source pour générer alléatoirement un labyrinthe :
[...]
nbcaseAzero=n*m;
while (nbcaseAzero>0){
[...]
voila , il se trouve que je ne sais vraiment pas pourquoi ma fonction
est infini, je pense que c'est a cause du return dans ma fonction
propager , mais je n'en sui pas sur, je suis blocker à cette fonction
depuis 3 jour.
Svp aidez moi , j'utilise cette algo pour générer mon labyrinthe.


Tu ne modifie jamais nbcaseAzero.


--
__Pascal Bourguignon__ http://www.informatimago.com/

NOTE: The most fundamental particles in this product are held
together by a "gluing" force about which little is currently known
and whose adhesive power can therefore not be permanently
guaranteed.

Angelus
Le #994596

Tu ne modifie jamais nbcaseAzero.
Si je modifie nbcaseAzero dans ma fonction compte_casezero que j'ai

implémenté dans ma fonction initialisation, ce qui est bizarre c que
ma fonction a juste l'air de marcher 3 fois , en effet, il ne fait
jamais le teste de
void initialisation (int n, int m){
......
else if (y&1){
else if (d<0){
laby[x][y]=laby[x-1][y];
stockvaleur=laby[x-1][y];
propager4((x+1),y,laby[x-1][y],
stockvaleur,nbcaseAzero,laby);
compte_casezero(nbcaseAzero,maxh,maxl,laby);

Pascal Bourguignon
Le #994595
Angelus

Tu ne modifie jamais nbcaseAzero.
Si je modifie nbcaseAzero dans ma fonction compte_casezero que j'ai

implémenté dans ma fonction initialisation, ce qui est bizarre c que
ma fonction a juste l'air de marcher 3 fois , en effet, il ne fait
jamais le teste de
void initialisation (int n, int m){
......
else if (y&1){
else if (d<0){
laby[x][y]=laby[x-1][y];
stockvaleur=laby[x-1][y];
propager4((x+1),y,laby[x-1][y],
stockvaleur,nbcaseAzero,laby);
compte_casezero(nbcaseAzero,maxh,maxl,laby);


En C, les arguments sont passés par VALEUR, pas par RÉFÉRENCE.
Par conséquent, tu ne modifie jamais la variable nbcaseAzero, quoique
tu fasse dans compte_casezero.


void compte_casezero(int m, int l, int h,int **matrice){
int i,j;
for (i=0;i<h;i++)
for (j=0; j<l; j++)
if (matrice[i][j]==0 && (i&1) && (j&1))
m--;
printf("%dn",m);
}

Tu vois bien! Ici tu modifie la variable m, pas la variable nbcaseAzero!!!


--
__Pascal Bourguignon__ http://www.informatimago.com/

NOTE: The most fundamental particles in this product are held
together by a "gluing" force about which little is currently known
and whose adhesive power can therefore not be permanently
guaranteed.


Angelus
Le #994594
a ok et si dans ma fonction compte_casezero a la place du m je met un
int *m , et qu'ensuite losque j'appelle ma variable nbcaseAzero avec
un & devant pensez vous ke cela marchera ??

exemple
void compte_casezero(int *m, int l, int h,int **matrice){
int i,j;
for (i=0;i<h;i++)
for (j=0; j<l; j++)
if (matrice[i][j]==0 && (i&1) && (j&1))
(*m)--;
printf("%dn",m);

}

initialisation (int n, int m){.....

compte_casezero(&nbcaseAzero,maxh,maxl,laby);
....

}

Sylvain
Le #994593
Angelus wrote on 28/05/2007 22:06:
a ok et si dans ma fonction compte_casezero a la place du m je met un
int *m , et qu'ensuite losque j'appelle ma variable nbcaseAzero avec
un & devant pensez vous ke cela marchera ??


mieux en effet!

nbcaseAzero = compte_casezero(maxh,maxl,laby);

serait également assez explicite.

avec
void compte_casezero(int l, int h,int **matrice){
int i,j,m = l * h;
for (i=0;i<h;i++)
for (j=0; j<l; j++)
if (matrice[i][j]==0 && (i&1) && (j&1))
m--;
return m;
}

Sylvain.

Pascal Bourguignon
Le #994592
Angelus
a ok et si dans ma fonction compte_casezero a la place du m je met un
int *m , et qu'ensuite losque j'appelle ma variable nbcaseAzero avec
un & devant pensez vous ke cela marchera ??

exemple
void compte_casezero(int *m, int l, int h,int **matrice){
int i,j;
for (i=0;i<h;i++)
for (j=0; j<l; j++)
if (matrice[i][j]==0 && (i&1) && (j&1))
(*m)--;
printf("%dn",m);

}

initialisation (int n, int m){.....

compte_casezero(&nbcaseAzero,maxh,maxl,laby);
....

}


Oui, ça a des chances de mieux marcher. D'une manière générale, en C
quand on veut passer une variable par référence, il faut le faire
explicitement ainsi.




Une autre façon de faire, puisque compte_casezero ne retourne pas
d'autre valeur, ce serait de retourner la nouvelle valeur de
nbcaseAzero, et de l'appeler ainsi;

nbcaseAzero=compte_casezero(nbcaseAzero,...);


int compte_casezero(int m, int l, int h,int **matrice){
int i,j;
for (i=0;i<h;i++)
for (j=0; j<l; j++)
if (matrice[i][j]==0 && (i&1) && (j&1))
m--;
printf("%dn",m);
return(m);
}


--
__Pascal Bourguignon__ http://www.informatimago.com/

NOTE: The most fundamental particles in this product are held
together by a "gluing" force about which little is currently known
and whose adhesive power can therefore not be permanently
guaranteed.


Angelus
Le #994591
oki merci je teste sa et je vous dis si sa marche
Angelus
Le #994590
oui cela marche , merci bcp ^^
Pierre Maurette
Le #994426

[...]

Oui, ça a des chances de mieux marcher. D'une manière générale, en C
quand on veut passer une variable par référence, il faut le faire
explicitement ainsi.


En C, on ne sait passer et retourner que des copies de valeurs. Il ne
faudrait me semble-t-il pas sortir de là.

Malheureusement, les concepteurs du langage, avec certainement de
bonnes raisons autres que d'alimenter les groupes de discussions en
questions, ont décidé que dans ce cadre précis, le nom d'un tableau
était compris comme l'adresse de ce tableau.

Les références n'existent pas en C. On peut imaginer que dans les
langages où elles existent, elles sont le plus souvent résolues de
façon invisible par le passage de la copie de la valeur d'un pointeur.

--
Pierre Maurette

Angelus
Le #994420
j'ai une petite question , est-il possible de possible de changer un
tableau d'entier en un tableau de caractère ??
Publicité
Poster une réponse
Anonyme