Partage
  • Partager sur Facebook
  • Partager sur Twitter

Attaque du cavalier france ioi

salut a tous

Sujet résolu
    10 août 2021 à 18:14:26

    je ne comprend pas ce sujet

    Vous devez écrire un programme qui détermine dans une partie d'échecs, si un cavalier peut prendre une pièce de l'adversaire. Rappelons que les échecs se jouent sur un plateau carré de 8 cases par 8. Un cavalier se déplace en avancant d'une case horizontalement ou verticalement, puis en allant en diagonale, sans revenir en arrière. Le cavalier peut se déplacer même si la case intermédiaire de son déplacement contient une pièce (amie ou ennemie).

    • Partager sur Facebook
    • Partager sur Twitter
      10 août 2021 à 18:29:24

      Qu'est-ce que tu ne comprends pas?
      Pour avancer horizontalement il faut ajouter ou sousttraire 1 à la valeur de la position sur les lignes.
      Il faut d'abord vérifier si on n'est pas au bord (indice==0 ou indice==7)
      Mème strattégie si tu veux te déplacer sur les colonnes.
      Pour avancer en diagonale, c'est sans doute plus compliqué ppour toi.
      Je préfère décrire le mouvement du cavalier comme suit:
      On avance de 1/2 dans une direction et de 2/1 dans la direction orthogonale (avancer ou reculer).
      Ça me semble plus simple car tu n'agit que sur un indice à la fois.
      Il y a 8 positions à trouver et vérifier si elles ne sont pas en dehors du jeu.
      (-1, -2), (-1, +2), (-2, -1), (-2, +1), (+1, -2), (+1, +2), (+2, -1), (+2, +1)
      • Partager sur Facebook
      • Partager sur Twitter

      Le Tout est souvent plus grand que la somme de ses parties.

        10 août 2021 à 19:47:00

        #include<bits/stdc++.h>
        using namespace std;
        int main() {
            char mat[8][8];
            for(int i = 0; i < 8; i++) {
               for(int j = 0; j < 8; j++) {
                  cin>>mat[i][j];
               }
            }
            for(int i = 2; i < 6; i++) {
                for(int j = 2;  j < 6; j++) {
                    if(mat[i][j] == 'C') {
                        if(islower(mat[i + 1][j - 2]) || islower(mat[i + 1][j + 2]) || islower(mat[i + 2][j - 1]) || islower(mat[i + 2][j + 1]) || islower(mat[i - 1][j - 2]) || islower(mat[i - 1][j + 2]) || islower(mat[i - 2][j - 1]) || islower(mat[i - 2][j + 1])) {
                            cout<<"yes\n";
                            return 0;
                        }
                    }
                }
            }
            cout<<"no\n";
            return 0;
        }
         

        ce code marche pour 9 des 10 tests et affiche "no" au lieu de "yes"
        • Partager sur Facebook
        • Partager sur Twitter
          10 août 2021 à 23:38:03

          Tu commences tes boucles à 2 et les termines à 6.
          Si un cavalier se trouve en 4,0 et je veux le faire aller en 2,1, tu ne le détectes pas.
          Tu as trop simplifié le problème.
          L'idée ici est de vérifier les bornes avant de se déplacer.
          Et il faut considérer tous les déplacements possibles.
          • Partager sur Facebook
          • Partager sur Twitter

          Le Tout est souvent plus grand que la somme de ses parties.

            11 août 2021 à 0:16:39

            je trouve la solution

            #include<bits/stdc++.h>
            using namespace std;
            // first check
            char check1(char mat[8][8], int ligne, int colonne) {
                ligne -= 1;
                colonne -= 2;
                if(ligne < 0 || ligne >= 8 || colonne < 0 || colonne >= 8)
                    return ' ';
                return mat[ligne][colonne];
            }
            
            // second check1
            char check2(char mat[8][8], int ligne, int colonne) {
                ligne++;
                colonne += 2;
                if(ligne < 0 || ligne >= 8 || colonne < 0 || colonne >= 8)
                    return ' ';
                return mat[ligne][colonne];
            }
            
            // thrird check
            char check3(char mat[8][8], int ligne, int colonne) {
                ligne += 2;
                colonne -= 1;
                if(ligne < 0 || ligne >= 8 || colonne < 0 || colonne >= 8)
                    return ' ';
                return mat[ligne][colonne];
            }
            
            // fourth check
            char check4(char mat[8][8], int ligne, int colonne) {
                ligne += 2;
                colonne += 1;
                if(ligne < 0 || ligne >= 8 || colonne < 0 || colonne >= 8)
                    return ' ';
                return mat[ligne][colonne];
            }
            // five check
            char check5(char mat[8][8], int ligne, int colonne) {
                ligne -= 1;
                colonne -= 2;
                if(ligne < 0 || ligne >= 8 || colonne < 0 || colonne >= 8)
                    return ' ';
                return mat[ligne][colonne];
            }
            
            char check6(char mat[8][8], int ligne, int colonne) {
                ligne -= 1;
                colonne += 2;
                if(ligne < 0 || ligne >= 8 || colonne < 0 || colonne >= 8)
                    return ' ';
                return mat[ligne][colonne];
            }
            
            char check7(char mat[8][8], int ligne, int colonne) {
                ligne -= 2;
                colonne -= 1;
                if(ligne < 0 || ligne >= 8 || colonne < 0 || colonne >= 8)
                    return ' ';
                return mat[ligne][colonne];
            }
            
            char check8(char mat[8][8], int ligne, int colonne) {
                ligne -= 2;
                colonne += 1;
                if(ligne < 0 || ligne >= 8 || colonne < 0 || colonne >= 8)
                    return ' ';
                return mat[ligne][colonne];
            }
            int main() {
                char mat[8][8];
                for(int i = 0; i < 8; i++) {
                   for(int j = 0; j < 8; j++) {
                      cin>>mat[i][j];
                   }
                }
                for(int i = 0; i < 8; i++) {
                    for(int j = 0; j < 8; j++) {
                        if(mat[i][j] == 'C') {
                            if(islower(check1(mat, i, j)) || islower(check2(mat, i, j)) || islower(check3(mat, i, j)) || islower(check4(mat, i, j)) || islower(check5(mat, i, j)) || islower(check6(mat, i, j)) || islower(check7(mat, i, j)) || islower(check8(mat, i, j))) {
                                cout<<"yes\n";
                                return 0;
                            }
                        }
                    }
                }
                cout<<"no\n";
                return 0;
            }



            • Partager sur Facebook
            • Partager sur Twitter
              11 août 2021 à 1:48:32

              Désolé, je ne peux pas colorer mon code avec une synthèse vocale.
              Ce code devrait fonctionner.
              L'utilisation d'un tableau de déplacements diminue considérablement le code.
              -
              #include <iostream>
              int main() {
                  char mat[8][8];
                  int move[8][2] = {{-2, -1}, {-2, 1}, {-1, -2}, {-1, 2}, {1, -2}, {1, 2}, {2, -1}, {2, 1}};
                  for(int i=0; i<8; i++) {
                      for(int j=0; j<8; j++) {
                          std::cin >> mat[i][j];
                      } // for j
                  } // for i
                  for(int i=0; i<8; i++) {
                      for(int j=0; j<8; j++) {
                          if(mat[i][j] == 'C') {
                              for(int p=0; p<8; p++) {
                                  int l = i + move[p][0];
                                  int c = j + move[p][1];
                                  if(0<=l && l<=7 && 0<=c && c<=7) {
                                      if(islower(mat[l][c])) {
                                          std::cout << "yes" << std::endl;
                                          return 0;
                                      } // islower
                                  } // if bornes
                              } // for p
                          } // if cavalier
                      } // for j
                  } // for i
                  std::cout << "no" << std::endl;
                  return 0;
              }  // main
              • Partager sur Facebook
              • Partager sur Twitter

              Le Tout est souvent plus grand que la somme de ses parties.

              Attaque du cavalier france ioi

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown