Problèmes des n reines sur un echiquier n *n

Résolu/Fermé
pipleton Messages postés 23 Date d'inscription vendredi 21 janvier 2011 Statut Membre Dernière intervention 15 juin 2012 - 9 févr. 2011 à 13:10
ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 - 10 févr. 2011 à 14:15
Bonjour,

Je dois réaliser un échiquier 4 * 4 dans lequel je dois placer une reine par colonne. Ensuite je dois calculer le nombre de conflit présent dans l'échiquier. Je m'explique une reine peut se déplacer en ligne, colonne ou diagonale. Chaque déplacement possible compte pour 1 ( soit le conflit).

Ainsi, l'échiquier (R = reine, 0 = pions) ci dessous possède 5 conflits.
R 0 R 0
0 R 0 R
0 0 0 0
0 0 0 0

J'ai réussi à implémenter l'échiquier ci dessus mais je n'arrive pas a calculer le nombre de conflits. En effet, si je ne compte pas les diagonales j'arrive à 4 ce qui est normal mais lorsque je compte les diagonales j'arrive à 6. En effet, il me compte deux fois la même prise! J'ai bien essayé une condition composé mais rien n'y fait! Par la suite l'échiquier sera généré aléatoirement (mais la ce n'est pas la question!). Pouvez vous m'aider?

Voici l'algorithme


#include <stdio.h>
#include <stdlib.h>

int main()
{
//partie déclarative
int tableau[4][4] = {{1,0,1,0},
{0,1,0,1},
{0,0,0,0},
{0,0,0,0}};// 0=pion, 1 = reine
int i,j,conflit;

//calcul du nombre de prise
conflit = 0;

//pour chaque ligne
for(i=0;i<4;i++){
//pour chaque colonne
for(j=0;j<4;j++){

if(tableau[i][j]==1)
{
if(tableau[i][j+1]==0)
{
conflit = conflit +1;
}
if(tableau[i+1][j+1]==0)
{
conflit = conflit +1;
}
}
}
}

printf("%s %d","H="conflit);


return 0;
}

15 réponses

lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
Modifié par lermite222 le 9/02/2011 à 16:26
Et moi Je ne comprends pas le raisonnement employer pour arriver à ces résultats.
EDIT :
Si ont prend ton dernier exemple...
1 0 1 0
0 1 0 0
0 0 0 1
0 0 0 0
conflit = 3
Moi je verrais..
Conflit 1 > A1/B2
Conflit 2 > C1/B2
Conflit 3 > B2/A1
Conflit 4 > B2/C1
??

L'expérience instruit plus sûrement que le conseil. (André Gide)
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
NOTE : Je ne répond pas aux MP pour les questions techniques.
Ça doit se passer sur le forum pour que tous puisse y participer ou en profiter.
1
enark78 Messages postés 417 Date d'inscription mardi 2 février 2010 Statut Membre Dernière intervention 12 juillet 2012 17
9 févr. 2011 à 16:04
pareil...
0
ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 2 428
Modifié par ccm81 le 9/02/2011 à 17:14
>lermite222
tu as compté 2 fois le conflit C1/B2
d'où la distinction (importante) orienté et non orienté
0
ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 2 428
9 févr. 2011 à 16:36
re
pour comptage à la main, sur l'exemple

1 0 1 0
0 1 0 0
0 0 0 1
0 0 0 0

on note (ligne, colonne) les coordonnées

- reine (1,1) en conflit avec (1,3), et (2,2)
- reine (1,3) en conflit avec (1,1) et (2,2)
- reine (2,2) en conflit avec (1,1) et (1,3)
- reine (3,4) en conflit avec personne

donc 6 conflits orientés
et 3 conflits non orientés
1
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
Modifié par lermite222 le 9/02/2011 à 19:08
Mais entre 1/3.. Y a un pion ???
Idem pour d'autre.
Relisant sont premier poste..
Ainsi, l'échiquier (R = reine, 0 = pions) ci dessous possède 5 conflits.
Ça ne correspond pas avec ta démo ?
J'abandonne car s'il ne donne pas une explication claire tout le monde va tourner en rond.
A+
0
ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 2 428
9 févr. 2011 à 19:04
j'espère que non !!!!
0
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
9 févr. 2011 à 19:10
Croisement de réponse :-)
Relisant sont premier poste..
Ainsi, l'échiquier (R = reine, 0 = pions) ci dessous possède 5 conflits.
Ça ne correspond pas avec ta démo ?
0
ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 2 428
Modifié par ccm81 le 9/02/2011 à 20:41
si !
d'ailleurs avec la sienne aussi, sauf que comme il compte les conflits orientés et donc 6+4 = 10 donc 5 conflits non orientés
le hic, c'est qu'on a du mal a savoir si c'est le comptage a la main ou l'algorithme qui lui pose pb

au passage, j'ai envoyé une demande sur "comment mettre les titres sur les axes excel 2010", et comme ça ne répond pas, est ce que tu connais?
0
enark78 Messages postés 417 Date d'inscription mardi 2 février 2010 Statut Membre Dernière intervention 12 juillet 2012 17
9 févr. 2011 à 13:53
je n'ai pas compris ce que tu appelles un conflit.
0
pipleton Messages postés 23 Date d'inscription vendredi 21 janvier 2011 Statut Membre Dernière intervention 15 juin 2012
9 févr. 2011 à 14:08
mais non je suis pas d'accord si je boucle de 0 à 3 je ne fais que les valeur 0,1,2!!!
Pour mon histoire de conflit, c'est le nombre de prise possible par une reine en gros. Ainsi une reine peut se déplacer, verticalement, horizontalement et en diagonale mais ne peut pas revenir sur ses pas! Ai je été pus clair?
Merci tout de même
0
enark78 Messages postés 417 Date d'inscription mardi 2 février 2010 Statut Membre Dernière intervention 12 juillet 2012 17
9 févr. 2011 à 14:14
elles doivent monter ou descendre ?
0
pipleton Messages postés 23 Date d'inscription vendredi 21 janvier 2011 Statut Membre Dernière intervention 15 juin 2012
9 févr. 2011 à 15:07
elles doivent monter
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
9 févr. 2011 à 15:57
il n'y a pas à être d'accord. si tu boucle de 0 à 4, tu va avoir un débordement de tableau.
C'est presque plus clair sur le conflit. Il aurait fallu que tu donnes les règles pour commencer. Aux échecs, rien n'empêche une dame de reculer.
0

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

Posez votre question
ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 2 428
Modifié par ccm81 le 9/02/2011 à 15:02
bonjour a tous les trois

peut être : si pour chaque reine tu compte le nombre de conflits (orientés) , tu devrais trouver le double du total des conflits (non orientés)

bonne suite
0
pipleton Messages postés 23 Date d'inscription vendredi 21 janvier 2011 Statut Membre Dernière intervention 15 juin 2012
9 févr. 2011 à 15:08
tout à fait mais l'un comme l'autre je ne trouve pas ce qu'il faut
0
ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 2 428
9 févr. 2011 à 15:12
re
si j'ai compris le pb, sur ton exemple
je compte 4 conflits orientés hors diagonales
et 6 conflits orientés sur les diagonales
soit un total de 10 orientés et 5 non orientés
0
pipleton Messages postés 23 Date d'inscription vendredi 21 janvier 2011 Statut Membre Dernière intervention 15 juin 2012
9 févr. 2011 à 15:25
Je suis tout a fait d'accord avec vous.Je préfererai pour ma part compter les conflits orientés. Pour le premier echiquier je suis passé par un tableau temporaire et cela fonctionne. Par contre si je prends les echiquiers ci dessous je en trouve pas le nombre de conflit voulus! Pouvez vous m'aider?
1 0 1 0
0 1 0 0
0 0 0 1
0 0 0 0
conflit = 3

1 0 1 0
0 0 0 0
0 0 0 1
0 1 0 0
conflit = 1

Merci d'avance

je remets mon code :

#include <stdio.h>
#include <stdlib.h>

int main()
{
//partie déclarative
int tableau[4][4] = {{1,0,1,0},
{0,1,0,1},
{0,0,0,0},
{0,0,0,0}};// 0=pion, 1 = reine

int temp[4][4] = {{0,0,0,0},
{0,0,0,0},
{0,0,0,0},
{0,0,0,0}};// 0=pion, 1 = reine;

int i,j,conflit;

//affichage du tableau
for(i=0;i<4;i++){
for(j=0;j<4;j++){
printf("%d",tableau[i][j]);
}
printf("\n");
}

//calcul du nombre de prise
conflit = 0;

//pour chaque ligne
for(i=0;i<4;i++){
//pour chaque colonne
for(j=0;j<4;j++){

if(tableau[i][j]==1)
{
if(tableau[i][j+1]==0)
{
temp[i+1][j]=2;
conflit ++;

if(tableau[i+1][j+1]==0 && temp[i][j+1]!=2)
{
conflit ++;
}
}
}
}
}

printf("%s%d","H=", conflit);


return 0;
}
0
ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 2 428
9 févr. 2011 à 15:33
re
je suis d'accord avec tes resultats sur les deux exemples ci-dessus
je ne connais pas le C++
mais une autre idée
si on compte (bestial) comme conflit une reine avec elle même ça nous fait 3 fois plus d'orientés que de non orientés et on n'a plus a s'embeter pour les plages de boucle
bon, c'est intéressant, je vais tenter en VBA
0
pipleton Messages postés 23 Date d'inscription vendredi 21 janvier 2011 Statut Membre Dernière intervention 15 juin 2012
9 févr. 2011 à 16:50
Ce n'est pas du C++ mais du C.
De plus, il ne faut pas compter(bestial)!
0
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
9 févr. 2011 à 15:03
Bonjour,
Quand tu "prend" un pion, remplacer la valeur de la case, par exemple par "S" cette case ne serait plus prise en compte.
A+
0
pipleton Messages postés 23 Date d'inscription vendredi 21 janvier 2011 Statut Membre Dernière intervention 15 juin 2012
9 févr. 2011 à 15:10
Tout a fait c'est ce que j'ai fait!Mais ça ne marche pas! car pour un echiquier donner suivant on doit trouver un conflit = 3 et un conflit = 1

1 0 1 0
0 1 0 0
0 0 0 1
0 0 0 0
conflit = 3

1 0 1 0
0 0 0 0
0 0 0 1
0 1 0 0
conflit = 1

Je ne comprends pas comment les trouver!
Merci d'avance
0
ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 2 428
9 févr. 2011 à 16:13
re
tu ne comprends pas quoi
- comment on les compte sur le papier ?
- comment on programme l'histoire ?
0
enark78 Messages postés 417 Date d'inscription mardi 2 février 2010 Statut Membre Dernière intervention 12 juillet 2012 17
9 févr. 2011 à 16:17
comment vous arrivez
0
enark78 Messages postés 417 Date d'inscription mardi 2 février 2010 Statut Membre Dernière intervention 12 juillet 2012 17
9 févr. 2011 à 16:17
comment vous arrivez a ces résultats en les comptant
0
enark78 Messages postés 417 Date d'inscription mardi 2 février 2010 Statut Membre Dernière intervention 12 juillet 2012 17
9 févr. 2011 à 16:45
Bizarre mais ok. Enfin pas tout a fait puisque j'ai cru comprendre qu'elles ne pouvaient que descendre donc (1,1) ne devrait pas etre en conflit avec (2,2). De meme pour (1,3) avec (2,2).
0
ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 2 428
9 févr. 2011 à 16:49
j'ai fait au plus simple, en comptant les conflits orientés ça donne le double des conflits non orientés,
0
pipleton Messages postés 23 Date d'inscription vendredi 21 janvier 2011 Statut Membre Dernière intervention 15 juin 2012
9 févr. 2011 à 16:53
Si elles peuvent descendre. Si je les laisser comprendre auparavant je m'en excuse. Mais comment peut on faire pour l'algorithme??? Parce que le miens n'a pas l'air bon, pouvez vous m'éclairer mes erreurs et m'aider à résoudre ce problème?
0
ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 2 428
Modifié par ccm81 le 9/02/2011 à 17:08
re

en VBA , ceci fonctionne (à priori)
- n est le nombre de lignes/colonnes de l'échiquier
- T est le tableau echiquier rempli de "" ou de "R"
- on ne compte que les conflits non orientés , donc en descendant (c'est finalement plus simple et moins bestial)

- à toi de traduire en C


Function NbConflits2(n As Long) As Long    
Dim nc As Long, li As Long, co As Long, c As Long, l As Long    
Dim T    
  T = Range("echiquier").Value    
  nc = 0    
  For li = 1 To n    
    For co = 1 To n    
      If T(li, co) = "R" Then    
        ' conflits dans ligne li    
          For c = co + 1 To n    
            If T(li, c) = "R" Then    
              nc = nc + 1    
            End If    
          Next c    
        ' conflits dans colonne co    
          For l = li + 1 To n    
            If T(l, co) = "R" Then    
              nc = nc + 1    
            End If    
          Next l    
        ' conflits dans diagonale1  \ en descendant à droite    
            l = li: c = co    
            While l < n And c < n    
              l = l + 1: c = c + 1    
              If T(l, c) = "R" Then    
                nc = nc + 1    
              End If    
            Wend    
        ' conflits dans diagonale2  /  en descendant à gauche    
            l = li: c = co    
            While l < n And c > 1    
              l = l + 1: c = c - 1    
              If T(l, c) = "R" Then    
                nc = nc + 1    
              End If    
            Wend    
      End If    
    Next co    
  Next li    
  NbConflits2 = nc    
End Function


bonne suite
0
pipleton Messages postés 23 Date d'inscription vendredi 21 janvier 2011 Statut Membre Dernière intervention 15 juin 2012
9 févr. 2011 à 17:10
je ne comprends pas le calcul en diagonal?Pouvez vous m'expliquer?
0
ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 2 428
Modifié par ccm81 le 9/02/2011 à 17:17
- diagonale 1 \ elle est décrite depuis (li,co) en descendant et en avançant (l augmente et c augmente)
- diagonale 2 / elle est décrite depuis (li,co) en descendant et en reculant (l augmente et c diminue)
0
pipleton Messages postés 23 Date d'inscription vendredi 21 janvier 2011 Statut Membre Dernière intervention 15 juin 2012
9 févr. 2011 à 17:25
Qu'est ce que cela signifie en VBA? C'est surtout le : qui m'intéresse!
l = li: c = co
merci d'avance
0
ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 2 428
9 févr. 2011 à 18:35
le : est un separatueur d'instruction
0
pipleton Messages postés 23 Date d'inscription vendredi 21 janvier 2011 Statut Membre Dernière intervention 15 juin 2012
9 févr. 2011 à 20:31
alors si j'ai bien compris l = li : c =co revient à faire
l = li
c = co
Je me trompe?
Si non, le calcul en diagonale ne fonctionne pas chez moi!
0
pipleton Messages postés 23 Date d'inscription vendredi 21 janvier 2011 Statut Membre Dernière intervention 15 juin 2012
9 févr. 2011 à 17:03
Merci je vais essayer! je vous tiens au courant
0
pipleton Messages postés 23 Date d'inscription vendredi 21 janvier 2011 Statut Membre Dernière intervention 15 juin 2012
9 févr. 2011 à 23:35
C'est bon j'ai enfin réussi à faire ce que je voulais!Merci de votre aide à tous
Bonne soirée ou plutot bonne nuit
0
ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 2 428
10 févr. 2011 à 14:15
re
bon, on y est donc arrivé
tu mets le pb a resolu
bonne journée
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
9 févr. 2011 à 13:51
Salut.
Je n'ai rien compris à ton histoire de conflit...
ce qui est sur, c'est que tu fais mal ta boucle, tu va chercher les cases voisines, mais celles-ci n'existe pas (d'où peut être ton erreur).
Boucle de 0 à 3 si tu veux être juste et éviter les erreurs de débordement.
-1