Parcourir une diagonale d un tableau en C

Fermé
dwyane346 Messages postés 147 Date d'inscription dimanche 11 janvier 2009 Statut Membre Dernière intervention 6 septembre 2012 - 6 avril 2009 à 03:23
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 6 avril 2009 à 14:59
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
A voir également:

6 réponses

dwyane346 Messages postés 147 Date d'inscription dimanche 11 janvier 2009 Statut Membre Dernière intervention 6 septembre 2012 18
6 avril 2009 à 13:24
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 ?.
1
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
6 avril 2009 à 13:54
sign c'est pour récupérer le signe. A toi de la définir.
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 ;-)).
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
6 avril 2009 à 14:26
Oui, comme l'a dit fiddy, sign() renvoie + ou - 1 selon le signe du paramètre. ça me semblait suffisamment explicite pour ne pas la détailler.
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.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844 > Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023
6 avril 2009 à 14:59
que ta tien à toi ? ^^.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
6 avril 2009 à 12:55
Voici la correction de mon code :
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.
0
NookZ Messages postés 2138 Date d'inscription jeudi 29 janvier 2009 Statut Membre Dernière intervention 7 mars 2013 514
6 avril 2009 à 09:11
pourquoi ne pas simplement incrémenter i et j à chaque passage dans la boucle du tableau?
-1
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
6 avril 2009 à 10:15
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.
-1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
6 avril 2009 à 12:19
Salut,
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
-1
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
6 avril 2009 à 12:31
Heu... fiddy, j'ai l'impression que tu parcours un carré entier avec ton algo. ça ne serait pas plutôt :
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.
-1
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
6 avril 2009 à 12:52
Oups, la bourde. M'apprendra à aller trop vite ^^.
0