Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème à résoudre

    29 octobre 2014 à 22:40:16

    Bonjour!

    alors voilà j'ai un problème à résoudre en effectuant un code en java sur france ioi , mais j'ai du mal à comprendre ce qui ne vas pas dans ce que j'ai fait, voici l'énoncé :

    Le programme doit d'abord lire un entier strictement positif correspondant au nombre de maisons. Ensuite, pour chaque maison, il doit lire la position horizontale (l'abscisse, le "x") et sa position verticale (l'ordonnée, le "y") de cette maison. Toutes les abscisses et ordonnées sont des entiers compris entre zéro et 1 million.

    Le programme doit alors afficher le périmètre de la plus petite clôture rectangulaire englobant toutes les maisons. Ce rectangle doit avoir ses côtés parallèles aux axes du repère, comme montré sur l'illustration.


    et voici mon code :

    import algorea.Scanner;
    class Main
    {
       public static void main(String[] args)
       {
          Scanner n=new Scanner(System.in);
          int m=n.nextInt();
          int p=0, o=0, d=0, e=0, f=0;
          for(int i=1; i<=m; i=i+1)
          {
             int x=n.nextInt();
             int y=n.nextInt();
             if (x>0)
             {
                o=o+x-1;
             }
             if (y>=3)
             {
                p=p+y-3;
             }
             if((d+e)*2>o+p)
             {
                f=d+e;
             }
             d=x;
             e=y;
          }
          System.out.print(f*2);
       }
    }


    Voilà alors je constate que ce code est faux mais je n'arrive pas à savoir pourquoi voilà pourquoi je demande de l'aide.

    Merci d'avance!


    • Partager sur Facebook
    • Partager sur Twitter
      29 octobre 2014 à 23:14:25

      On va avoir du mal à t'aider avec un bout de code avec des variables sous forme de lettres ...

      EDIT : Voici un exemple de code qui doit être facile à comprendre :

      import java.awt.Point;
      import java.util.ArrayList;
      
      public class MaisonCloture
      {
      	public static void main(String[] args)
      	{
      		//	0----------->x
      		//	|
      		//	|
      		//	|
      		//	|
      		//	V
      		//  y
      		
      		ArrayList<Point> maisons = new ArrayList<>();
      		maisons.add(new Point(5, 10));//x, y
      		maisons.add(new Point(60, 23));
      		maisons.add(new Point(40, 24));
      		maisons.add(new Point(67, 55));
      		maisons.add(new Point(85, 10));
      		maisons.add(new Point(51, 98));
      		maisons.add(new Point(1, 37));
      		
      		int plusPetitX = (int) maisons.get(0).getX();
      		int plusPetitY = (int) maisons.get(0).getY();
      		int plusGrandX = (int) maisons.get(0).getX();
      		int plusGrandY = (int) maisons.get(0).getY();
      		int currentX = 0;
      		int currentY = 0;
      		for(int i = 1; i < maisons.size(); i++)
      		{
      			currentX = (int) maisons.get(i).getX();
      			currentY = (int) maisons.get(i).getY();
      			plusPetitX = (currentX < plusPetitX) ? currentX : plusPetitX;
      			plusPetitY = (currentY < plusPetitY) ? currentY : plusPetitY;
      			plusGrandX = (currentX > plusGrandX) ? currentX : plusGrandX;
      			plusGrandY = (currentY > plusGrandY) ? currentY : plusGrandY;
      		}
      		
      		System.out.println("Perimètre : " + (2 * ((plusGrandX - plusPetitX) + (plusGrandY - plusPetitY))));
      	}
      }
      



      -
      Edité par LeSuricateFurtif 29 octobre 2014 à 23:46:49

      • Partager sur Facebook
      • Partager sur Twitter
      Un de ces quatre, viens faire un tour sur Zeste de Savoir !
        30 octobre 2014 à 0:37:42

        Bien sûr j'en suis navré, voilà le code annoté, cela ne se reproduira plus.

        import algorea.Scanner;
        public class Cloture
        {
           public static void main(String[] args)
           {
              Scanner variable=new Scanner(System.in);
              //entrer le nombre de maisons
        	  int maison=variable.nextInt();
              int Xtotal=0, Ytotal=0, nouveauX=0, nouveauY=0, additionouveauXY=0;
              for(int i=1; i<=maison; i=i+1)
              {
                 int valeurX=variable.nextInt();
                 int valeurY=variable.nextInt();
                 if (valeurX>0)
                 {
                    Xtotal=Xtotal+valeurX-1;
                 }
                 if (valeurY>=3)
                 {
                    Ytotal=Ytotal+valeurY-3;
                 }
                 if((nouveauX+nouveauY)*2>Xtotal+Ytotal)
                 {
                    additionouveauXY=nouveauX+nouveauY;
                 }
                 nouveauX=valeurX;
                 nouveauY=valeurY;
              }
              System.out.print(additionouveauXY*2);
           }




        voici également l'illustration que j'ai oublié de mettre avec l'énoncé :

        Le programme doit alors afficher le périmètre de la plus petite clôture rectangulaire englobant toutes les maisons. Ce rectangle doit avoir ses côtés parallèles aux axes du repère, comme montré sur l'illustration.

        -
        Edité par Windows_9x 30 octobre 2014 à 0:41:36

        • Partager sur Facebook
        • Partager sur Twitter
          30 octobre 2014 à 1:47:28

          Regardes mon code, ça va t'aider, même si moi j'ai utilisé les axes conventionnels d'un écran.
          • Partager sur Facebook
          • Partager sur Twitter
          Un de ces quatre, viens faire un tour sur Zeste de Savoir !
            30 octobre 2014 à 21:45:06

            bien j'ai rentré le code suivant mais cependant il ne passe pas tous les tests, je ne vois pas trop ce qui ne vas pas.

            import algorea.Scanner;
            class Main
            {
               public static void main(String[] args)
               {
                  Scanner variable=new Scanner(System.in);
                  int maisons= variable.nextInt();
                  int PlusPetitX=0, PlusPetitY=0; 
                  int PlusGrandX=0, PlusGrandY=0;
                  int currentX=0, currentY=0;
                  for (int i=1; i<=maisons; i++)
                  {
                     currentX=variable.nextInt(); //valeur rentrée
                     currentY=variable.nextInt();
                     if (currentX>0)
                     {
                        PlusPetitX = (currentX < PlusPetitX) ? currentX-1 : PlusPetitX;
                        PlusGrandX = (currentX > PlusGrandX) ? currentX-1 : PlusGrandX;
                     }
                     if (currentY>=3) 
                     { 
                        PlusPetitY = (currentY < PlusPetitY) ? currentY-3 : PlusPetitY;
                        PlusGrandY = (currentY > PlusGrandY) ? currentY-3 : PlusGrandY;
                     }
                  }
                  int demiperi=(PlusGrandX-PlusPetitX)+(PlusGrandY-PlusPetitY);
                  if (demiperi<=currentX+currentY)
                  System.out.println(2*((PlusGrandX-PlusPetitX)+(PlusGrandY-PlusPetitY)));
                  else
                  System.out.println(2*((PlusGrandX-PlusPetitX)+(PlusGrandY-PlusPetitY)+4));
               }
            }



            • Partager sur Facebook
            • Partager sur Twitter
              30 octobre 2014 à 23:16:24

              Donne nous le lien de l'exercice, ça nous permettra de faire des tests ...

              -
              Edité par LeSuricateFurtif 30 octobre 2014 à 23:16:36

              • Partager sur Facebook
              • Partager sur Twitter
              Un de ces quatre, viens faire un tour sur Zeste de Savoir !

              problème à résoudre

              × 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