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=3D2*n+1;
maxh=3D2*m+1;
laby=3Dallouer2d(maxl,maxh);
nbcaseAzero=3Dn*m;
k=3D0;
for (i=3D0;i<maxl;i++){
for (j=3D0;j<maxh; j++){
if ((i%2!=3D0) && j%2!=3D0){
laby[i][j]=3Dk++;
}
else laby[i][j]=3D-1;
}
}
afficher (maxh , maxl, laby);
while (nbcaseAzero>0){
x=3D(rand()%(maxl-2)) + 1;
y=3D(rand() %(maxh-2)) + 1;
while ((x&1)=3D=3D(y&1)){
x=3D(rand()%(maxl-2)) + 1;
y=3D(rand() %(maxh-2)) + 1;
}
if (x&1){
d=3Dlaby[x][y-1]-laby[x][y+1];
if (d>0) {
laby[x][y]=3Dlaby[x][y+1];
stockvaleur=3Dlaby[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]=3Dlaby[x][y-1];
stockvaleur=3Dlaby[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=3Dlaby[x-1][y]-laby[x+1][x];
if (d>0) {
laby[x][y]=3Dlaby[x+1][y];
stockvaleur=3Dlaby[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]=3Dlaby[x-1][y];
stockvaleur=3Dlaby[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=3Dmalloc(h*sizeof*t);
assert(t);
for (i=3D0;i<h;i++){
t[i]=3Dmalloc (l*sizeof*t[i]);
assert (t[i]);
}
return t;
}
void liberer2d(int*** q,int h){
int i;
for (i=3D0;i<h;i++)
free(*q);
*q=3DNULL;
}
void propager(int x,int y,int nouvelvaleur,int ancienvaleur,int nb,int
**matrice) {
if (nb=3D=3D0) exit(0);
if(matrice[x][y]!=3Dancienvaleur) return;
matrice[x][y]=3Dnouvelvaleur;
}
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);
}
void afficher(int l, int h,int **pointeur){
int i,j;
for (i=3D0; i<h;i++){
for (j=3D0; j<l; j++){
printf ("%3d",pointeur[i][j]);
}
printf("\n");
}
printf("\n");
}
void Pcc(int x1,int y1,int x2,int y2,int v,int **L){
v=3Dv+1;
L[x1][y1]=3Dv;
if(x1=3D=3Dx2&&y1=3D=3Dy2) return;
if (v < L[x1+1][y1] || L[x1+1][y1] =3D=3D 0)
Pcc(x1, y1+1, x2, y2, v,L);
if (v < L[x1-1][y1] || L[x1-1][y1] =3D=3D 0)
Pcc(x1, y1-1, x2, y2, v,L);
if (v < L[x1][y1+1] || L[x1][y1+1] =3D=3D 0)
Pcc(x1+1, y1, x2, y2, v,L);
if (v < L[x1][y1-1] || L[x1][y1-1] =3D=3D 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=3D0;i<h;i++)
for (j=3D0; j<l; j++)
if (matrice[i][j]=3D=3D0 && (i&1) && (j&1))
m--;
printf("%d\n",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 =E0 cette fonction
depuis 3 jour.
Svp aidez moi , j'utilise cette algo pour g=E9n=E9rer mon labyrinthe.
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.
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 <shenneoron@gmail.com> writes:
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.
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.
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.
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
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);
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);
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
Angelus writes:
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!!!
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 <shenneoron@gmail.com> writes:
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!!!
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.
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!!!
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
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);
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);
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);
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.
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;
}
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
Angelus writes:
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);
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); }
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 <shenneoron@gmail.com> writes:
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);
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);
}
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.
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);
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); }
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.
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
[...]
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.
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
j'ai une petite question , est-il possible de possible de changer un tableau d'entier en un tableau de caractère ??
j'ai une petite question , est-il possible de possible de changer un
tableau d'entier en un tableau de caractère ??