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
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
A voir également:
- Parcourir une diagonale d un tableau en C
- Tableau croisé dynamique - Guide
- Tableau ascii - Guide
- Comment faire un tableau - Guide
- Comment imprimer un tableau excel sur une seule page - Guide
- Trier un tableau excel - Guide
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
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 ?.
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 ?.
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
6 avril 2009 à 12:55
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.
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
6 avril 2009 à 09:11
pourquoi ne pas simplement incrémenter i et j à chaque passage dans la boucle du tableau?
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
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.
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
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
6 avril 2009 à 12:19
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
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
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 :
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.
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
6 avril 2009 à 12:52
Oups, la bourde. M'apprendra à aller trop vite ^^.
6 avril 2009 à 13:54
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 ;-)).
6 avril 2009 à 14:26
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.
6 avril 2009 à 14:59