Parcourir une diagonale d un tableau en C
dwyane346
Messages postés
147
Date d'inscription
Statut
Membre
Dernière intervention
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
j ai un char [9][9];
je veux parcourir les diagonales;
par exemple
0 1 2 3 4
0 0 0 1 0 0
1 0 0 0 1 0
2 0 0 0 0 1
dans mon programme jai le point de depart et darriver ici par exemple i_initiale = 0; j_initiale = 2;
i_finale = 2; j_finale = 4;
donc tab[i_initiale][j_initiale] = 1;
tab[i_finale][j_finale] = 1;
je voudrai massurer par exemple qu il y ai que des 1 dans la diagonale;
et je voudrai ossi etre sur qu il est en train de parcourir une diagonal c a dire si il commance a tab[0][2] et que le poin finale est tab[1][5] qu il me retourne 0
merci;
en faite je veux faire une fonction qui test le deplacement du fou aux jeux d echeque
A B C D E F G H
8 T C F R O F C T
7 P P P P P P P P
6 . . . . . . . .
5 . . . . . . . .
4 . . . . . . . . .
3 . . . . . . . . .
2 p p p p p p p p
1 t c f r o f c t
now si on me propose un deplacement invalide du fou je veux retourner 0 par exemple
C8-D6 est valide dans la mesure qu il parcour bien une diagonale (dou mn blem)
mais il nes po valide car il ya un pion dans la trajectoire diagonale .
alors quell boucle pour tester ke la diagonale en language C
j ai un char [9][9];
je veux parcourir les diagonales;
par exemple
0 1 2 3 4
0 0 0 1 0 0
1 0 0 0 1 0
2 0 0 0 0 1
dans mon programme jai le point de depart et darriver ici par exemple i_initiale = 0; j_initiale = 2;
i_finale = 2; j_finale = 4;
donc tab[i_initiale][j_initiale] = 1;
tab[i_finale][j_finale] = 1;
je voudrai massurer par exemple qu il y ai que des 1 dans la diagonale;
et je voudrai ossi etre sur qu il est en train de parcourir une diagonal c a dire si il commance a tab[0][2] et que le poin finale est tab[1][5] qu il me retourne 0
merci;
en faite je veux faire une fonction qui test le deplacement du fou aux jeux d echeque
A B C D E F G H
8 T C F R O F C T
7 P P P P P P P P
6 . . . . . . . .
5 . . . . . . . .
4 . . . . . . . . .
3 . . . . . . . . .
2 p p p p p p p p
1 t c f r o f c t
now si on me propose un deplacement invalide du fou je veux retourner 0 par exemple
C8-D6 est valide dans la mesure qu il parcour bien une diagonale (dou mn blem)
mais il nes po valide car il ya un pion dans la trajectoire diagonale .
alors quell boucle pour tester ke la diagonale en language C
A voir également:
- Parcourir une diagonale d un tableau en C
- Tableau word - Guide
- Trier un tableau excel - Guide
- Tableau ascii - Guide
- Comment imprimer un tableau excel sur une seule page - Guide
- Tableau croisé dynamique - Guide
6 réponses
merci les ga finalement j avais resolu mon problem en fesant
for (i = i_ini; i <= i_fin; i++)
{
for (j = j_ini; j <= j_fin; j++)
{
if (((i != i_ini) && (j != j_ini)) && ((i != i_fin) && (j_ini != j_fin)))
{
if (tab[i][j_ini + a] != '.')
{
return(0);
}
}
b++;
}
a++;
}
if (a != b)
{
if (b == a * a)
{
return (1);
}
}
j ai fait 4boucles de ce genre car il y a 4 diagonale merci
mais je kiff le code de snipper mais le deplacement du fou n est pas unidirectionel et elle fait quoi ta fonction sign ?.
for (i = i_ini; i <= i_fin; i++)
{
for (j = j_ini; j <= j_fin; j++)
{
if (((i != i_ini) && (j != j_ini)) && ((i != i_fin) && (j_ini != j_fin)))
{
if (tab[i][j_ini + a] != '.')
{
return(0);
}
}
b++;
}
a++;
}
if (a != b)
{
if (b == a * a)
{
return (1);
}
}
j ai fait 4boucles de ce genre car il y a 4 diagonale merci
mais je kiff le code de snipper mais le deplacement du fou n est pas unidirectionel et elle fait quoi ta fonction sign ?.
Voici la correction de mon code :
Ensuite, il faudra vérifier également que ton roi n'est pas en échec après le déplacement du fou.
if( i_initial==i_final || j_initial==j_final) return 0; //la pièce doit se déplacer int di=( i_final > i_initial) ? 1 : -1; int dj=( j_final > j_initial) ? 1 : -1; if ( di*(i_final-i_initial) != dj*(j_final-j_initial) ) return 0; //déplacement non diagonal for(int i=i_initial+di, j=j_initial+dj; i != i_final && j != j_final; i+=di, j+=dj) { if(tab[i][j] != 0) return 0; //si la case n'est pas vide (0), on renvoie 0 : déplacement incorrect. if( tab[i_final][j_final] ...) return 0; //il faut aussi vérifier que la case d'arrivée n'est pas une pièce qui t'appartient
Ensuite, il faudra vérifier également que ton roi n'est pas en échec après le déplacement du fou.
Salut.
C'est vrai qu'une diagonale, ça consiste à incrémenté ou décrémenté i en même temps que j (incrémenté ou décrémenté c'est selon la diagonale choisi et le sens choisi)
Première condition pour voir si le déplacement est valable, c'est de faire une opération sur les case :
Si ton pion est en x0y0 et qu'on lui demande d'aller en x1y1, il faut que : abs(x1-x0)==abs(y0-y1).
Ensuite, il te suffit de parcourir le tableau.
C'est vrai qu'une diagonale, ça consiste à incrémenté ou décrémenté i en même temps que j (incrémenté ou décrémenté c'est selon la diagonale choisi et le sens choisi)
Première condition pour voir si le déplacement est valable, c'est de faire une opération sur les case :
Si ton pion est en x0y0 et qu'on lui demande d'aller en x1y1, il faut que : abs(x1-x0)==abs(y0-y1).
Ensuite, il te suffit de parcourir le tableau.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Salut,
Voici un exemple de code :
Ensuite, il faudra vérifier également que ton roi n'est pas en échec après le déplacement du fou.
Cdlt
Voici un exemple de code :
for(int i=i_initial;i<i_final;i++) for(int j=j_initial;j<final;j++) if(tab[i][j] != 0) return 0; //si la case n'est pas vide (0), on renvoie 0 : déplacement incorrect. if( tab[i_final][j_final] ...) return 0; //il faut aussi vérifier que la case d'arrivée n'est pas une pièce t'appartenant
Ensuite, il faudra vérifier également que ton roi n'est pas en échec après le déplacement du fou.
Cdlt
Heu... fiddy, j'ai l'impression que tu parcours un carré entier avec ton algo. ça ne serait pas plutôt :
Ou un truc s'en rapprochant (pas vérifier les conditions limites). Le déplacement du fou est unidirectionnel, donc une seule boucle suffit.
EDIT : on met i++, mais c'est vrai que ça dépend du parcours du fou. Dans le for, un i+=sign(i_final-i_initial) serait peut être mieux. Sans parler du i_final.
for(int i=i_initial+1;i<i_final;i++)//i_initial + 1 pour ne pas tester la casse où est le fou if(tab[i][j_initial+sign(j_final-j_initial)*sign(i_final-i_initial)*(i-i_initial)] != 0) return 0;
Ou un truc s'en rapprochant (pas vérifier les conditions limites). Le déplacement du fou est unidirectionnel, donc une seule boucle suffit.
EDIT : on met i++, mais c'est vrai que ça dépend du parcours du fou. Dans le for, un i+=sign(i_final-i_initial) serait peut être mieux. Sans parler du i_final.
Par contre, je sais pas si t'as vu mon code #6, mais il te permet de ne faire qu'une boucle for et ce pour toutes les directions du fou.
Enfin si tu préfères faire toutes les directions, c'est ton choix ;-)).
Attention à mon code, il doit être chargé de bugs.
Fiddy a fait un bon résumé de nos idées. Pas assez compacte à mon goût, mais surement moins bugguer que ma mien.