Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Gros probleme labyrinthe , boucle infini

26 réponses
Avatar
Angelus
voila mon code source pour g=E9n=E9rer all=E9atoirement 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=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);
}

/*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=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.

http://209.85.135.104/search?q=3Dcache:KqVCk5OegmQJ:www.ai.univ-paris8.fr/~=
amsi/SD0607S1/supports/cours07.pdf+Le+plus+court+chemin+dans+un+labyrinthe&=
hl=3Dfr&ct=3Dclnk&cd=3D9&gl=3Dfr

10 réponses

1 2 3
Avatar
Angelus
ben voila , en faite j'ai ma fonction afficher:


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



}

quand je la lance elle m'affiche des 42 et des 38 qui sont les numéro
ascII des caractere espace et etoile, moi je veux qu'elle m'affiche
les caracteres et non leur nombre ascII est-ce possible et comment
puis-je le faire ??
Avatar
Sylvain
Angelus wrote on 30/05/2007 22:08:
j'ai une petite question , est-il possible de possible de changer un
tableau d'entier en un tableau de caractère ??


pour tout CPU, un nombre est un nombre, nous humain sommes habitué aux
lettres et on les lit mieux que des nombres mais le mapping 'A'd est
juste une transposition arbitraire.

ben voila , en faite j'ai ma fonction afficher:

printf ("%3d",pointeur[i][j]);


%d affiche un entier signé, %u un entier non signé et %c un caractère
donc (en supposant le contenu de pointeur transposable dans la table
ASCII): printf("%c", pointeur[i][j]);

Sylvain.

Avatar
Angelus
On 30 mai, 22:24, Sylvain wrote:
Angelus wrote on 30/05/2007 22:08:

j'ai une petite question , est-il possible de possible de changer un
tableau d'entier en un tableau de caractère ??


pour tout CPU, un nombre est un nombre, nous humain sommes habitué aux
lettres et on les lit mieux que des nombres mais le mapping 'A'd est
juste une transposition arbitraire.

ben voila , en faite j'ai ma fonction afficher:

printf ("%3d",pointeur[i][j]);


%d affiche un entier signé, %u un entier non signé et %c un caractè re
donc (en supposant le contenu de pointeur transposable dans la table
ASCII): printf("%c", pointeur[i][j]);

Sylvain.


a oki merci pour l'info ^^


Avatar
Angelus
Rebonjour désoler de vous ennuyer encore une fois , voila j'ai un core
dumped qui provient de ma fonction modifier , mais je ne sais pas
pourquoi ce core dumped a lieu car ma fonction modifier est bien
ecrit, pourriez vous m'aider svp:
/*
** laby.c
**
** Made by (shenneoron)
** Login
**
** Started on Mon May 14 14:44:58 2007 shenneoron
** Last update Mon Jun 4 17:42:58 2007 shenneoron
*/

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

int main (void){
int **laby;
int **copie;
srand(time(NULL));
initialisation(22,20,laby,copie);
return 0;
}

void initialisation (int n, int m, int **laby,int **copie){
int k,i,j,nbcaseAzero,x,y,d,maxl,maxh,stockvaleur;

maxl=2*n+1;
maxh=2*m+1;
if (n<=m){
laby=allouer2d(maxl,maxh);
copie=allouer2d(maxl,maxh);}
else if (n>m){
laby=allouer2d(maxh,maxl);
copie=allouer2d(maxh,maxl);}
nbcaseAzero=maxl*maxh;
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;
}
}
while (nbcaseAzero>0){
if (laby[1][1]!=0) return initialisation(22,20,laby,copie);
x=1;
y=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];
propager(x,(y-1),laby[x][y+1],
stockvaleur,&nbcaseAzero,laby,n,m,copie);
}
else if (d<0){
laby[x][y]=laby[x][y-1];
stockvaleur=laby[x][y+1];
propager(x,(y+1),laby[x][y-1],
stockvaleur,&nbcaseAzero,laby,n,m,copie);
}
}
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];
propager((x-1),y,laby[x+1][y],
stockvaleur,&nbcaseAzero,laby,n,m,copie);
}
else if (d<0){
laby[x][y]=laby[x-1][y];
stockvaleur=laby[x+1][y];
propager((x+1),y,laby[x-1][y],
stockvaleur,&nbcaseAzero,laby,n,m,copie);
}
}
}
copier(maxh,maxl, copie, laby);
afficher2 (maxh , maxl, laby);
chemin(1,1,2,3,0,copie,maxl,maxh);
afficher2 (maxh , maxl, copie);
}

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,int n, int m, int **copie) {
if(matrice[x][y]!=ancienvaleur) return;
matrice[x][y]=nouvelvaleur;
if (matrice[x][y]==0 && (x&1) && (y&1))
(*nb)--;
}




void propager4(int x,int y,int nouvelvaleur,int ancienvaleur, int
*nb ,int **matrice,int n, int m, int **copie){
if (matrice[1][1]!=0) return initialisation(22,20,matrice,copie);
propager((x+1),y,nouvelvaleur,ancienvaleur,nb,matrice,n,m,copie);
propager((x-1),y,nouvelvaleur,ancienvaleur,nb,matrice,n,m,copie);
propager(x,(y+1),nouvelvaleur,ancienvaleur,nb,matrice,n,m,copie);
propager(x,(y-1),nouvelvaleur,ancienvaleur,nb,matrice,n,m,copie);
}




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("n");
}
printf("n");
}





void afficher2(int l, int h,int **pointeur){
int i,j;
for (i=0; i<h;i++){
for (j=0; j<l; j++){
if (pointeur[i][j]==-1&& (!(j&1) || !(i&1))) pointeur[i][j]='*';
else if (pointeur[i][j]==-2) pointeur [i][j]='+';
else if (pointeur[i][j]==0)pointeur[i][j]=' ';
else pointeur[i][j]='*';
}
}
for (i=0; i<h;i++){
for (j=0; j<l; j++){
printf ("%c",pointeur[i][j]);
}
printf("n");
}
printf("n");
}




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





void copier(int l, int h, int **copie, int **laby){
int i, j;
for (i=0; i<h; i++)
for (j=0; j<l; j++)
if(laby[i][j]!=0) copie[i][j]=-1;
else copie[i][j]=laby[i][j];

}




void inv_pcc(int x,int y,int v,int **L){
L[x][y] = -2;

if (v == 1) return ;

v--;

if (v == L[x+1][y])

inv_pcc(x+1, y, v,L);

else if (v == L[x-1][y])

inv_pcc (x-1, y, v,L);

else if (v == L[x][y +1])

inv_pcc (x,y+1 , v,L);

else if (v == L[x][y-1])

inv_pcc (x,y-1 , v,L);
}
void modifier(int **L,int maxl,int maxh){
int i,j;
for (j=0; i < maxl; j++)

for (i=0; j < maxh; i++)

if (L[j][i] > -1) L[i][j]=0;}

void chemin(int x1,int y1,int x2,int y2,int v,int **L,int maxl,int
maxh){
Pcc(x1, y1, x2, y2, v,L,maxl,maxh);
afficher(maxh,maxl,L);
v=L[x2][y2];
inv_pcc(x2,y2,v,L);

L[x1][y1] = -2;

L[x2][y2] = -2;
modifier(L,maxl,maxh);
}
Avatar
espie
In article ,
Angelus wrote:
Rebonjour désoler de vous ennuyer encore une fois , voila j'ai un core
dumped qui provient de ma fonction modifier , mais je ne sais pas
pourquoi ce core dumped a lieu car ma fonction modifier est bien
ecrit, pourriez vous m'aider svp:


Bon, au premier passage de ce code, je n'avais rien dit, mais la
je craque.

Ton code est illisible. Les noms des fonctions sont mal choisis, les
fonctions ont souvent trois fois trop de parametres (ca manque de
quelques struct) et il faudrait des commentaires pour alleger un peu
l'ensemble. Sans compter les doubles ou triples pointeurs sur des
entiers... ca se comprend en y passant du temps, mais tu pourrais
certainement ecrire la meme chose de facon bien plus claire, sans
perdre de performances, et sous un format qui donnerait envie de
lire ton code.

Il est fort probable qu'il y a un bug quelque part dans ton code,
ailleurs que dans la fonction modifier(), tres certainement.

C'est le charme du C: les erreurs d'allocation memoire et d'indices
ont souvent des effets a retardement.

Je ne saurais trop te conseiller d'utiliser des outils de debug: une
bibliotheque d'allocation un peu moins permissive que celle par defaut,
ou un outil de type efence ou valgrind.

Tu decouvriras tres certainement que ton code plante ailleurs... en
ecrivant a un endroit qui perturbe fortement ta pauvre fonction
modifier().

Avatar
Eric Levenez
Le 4/06/07 21:41, dans
, « Angelus »
a écrit :

Rebonjour désoler de vous ennuyer encore une fois , voila j'ai un core
dumped qui provient de ma fonction modifier , mais je ne sais pas
pourquoi ce core dumped a lieu car ma fonction modifier est bien
ecrit, pourriez vous m'aider svp:


Utilises gdb pour trouver où se trouve le plantage et dit nous cela.
Sur ma machine PowerPC, cela ne plante pas, mais cela ne veux rien dire.

int main (void){
int **laby;
int **copie;
srand(time(NULL));
initialisation(22,20,laby,copie);


laby et copie sont deux pointeurs non initialisées, et tu passes ces valeurs
à initialisation qui va utiliser ces 2 valeurs quelconques. Avec de la
chance cela peut marcher.

Peut-être voulais-tu écrire un truc du genre "&laby, &copie"

return 0;
}

void initialisation (int n, int m, int **laby,int **copie){


Auquel cas il faudrait un ***laby et un ***copie.

void modifier(int **L,int maxl,int maxh){
int i,j;
for (j=0; i < maxl; j++)


"i" est non initialisé.

Essaye de compiler avec des options de warning, cela pourrait t'aider.

Essaye de mettre des commentaires pour expliquer ton code.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.

Avatar
Angelus
merci beaucoup , je sui desoler si mon code est brouillon, merci du
conseille , pour le momemt je ne met aucun commectaire, car je n'ai
pas encor fini, je v rajouter des structures, encor merci
Avatar
Eric Levenez
Le 5/06/07 15:23, dans
, « Angelus »
a écrit :

merci beaucoup , je sui desoler si mon code est brouillon,


Oui, c'est rien de le dire.

merci du
conseille , pour le momemt je ne met aucun commectaire, car je n'ai
pas encor fini,


C'est une très mauvaise méthode. On place les commentaires pendant que l'on
code, pas après coup. Dès que tu définis une variable, tu la décris, pour
chaque fonction, tu décris ce qu'elle fait et ses paramètres
d'entrée/sortie...

je v rajouter des structures, encor merci


D'abord des commentaires.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.

Avatar
Laurent Deniau
On 5 juin, 18:16, Eric Levenez wrote:
Le 5/06/07 15:23, dans
, « Angelus »

merci beaucoup , je sui desoler si mon code est brouillon,


Oui, c'est rien de le dire.

merci du
conseille , pour le momemt je ne met aucun commectaire, car je n'ai
pas encor fini,


C'est une très mauvaise méthode. On place les commentaires pendant qu e l'on
code, pas après coup. Dès que tu définis une variable, tu la décr is, pour
chaque fonction, tu décris ce qu'elle fait et ses paramètres
d'entrée/sortie...


Le genre de code que je ne lis pas non plus... Le code doit contenir
un minimum de commentaires. Si sa comprehension necessite beaucoup de
commentaires c'est qu'il est mal ecrit.

je v rajouter des structures, encor merci


D'abord des commentaires.


D'abord les structures (et le reste) ;-)

a+, ld.


Avatar
Thierry B
On 2007-06-05, Eric Levenez wrote:

C'est une très mauvaise méthode. On place les commentaires pendant que l'on
code, pas après coup.


Même pas vrai. La meilleur méthode, c'est écrire d'abord les
commentaires, laisser mariner un ou deux jours, et revenir
mettre le code...

J'ai mis vingt ans à me rendre compte de ça :)


--
{ SIGWHAT?!!, "BACKSIGNAL" },
/* the processus signal the kill program it disagree
with the previous signal given. See anarchy(3) */
--{ f.m.b.l revisite la command kill }--

1 2 3