Reaali Robootika.COM

NXT robotimaailm ja programmeerimine C-keeles

Informaatika olümpiaadi põhikooli eelvoor – Kurgipeenar

http://www.teaduskool.ut.ee/orb.aw/class=file/action=preview/id=6379/poh.et.pdf 

2. Kurgid - 1 sekund - 30 punkti

Talunikul on ristküliku kujuline põld ja ta tahab sellele teha kurgipeenra. Selleks, et peenart oleks parem masinatega harida, peab ka peenar olema ristküliku kujuline ja selle servad peavad olema paralleelsed põllu servadega.

Põllul on kaks mobiilimasti. Selleks, et peenart saaks öökülmade kaitseks kilega katta, ei tohi mastid olla peenra sees.

Kirjutada programm, mis leiab peenra maksimaalse võimaliku pindala.

Sisend. Tekstifaili kurgid2.sis esimesel real on põllu pikkus X (0 < X <= 109) ja laius Y (0 < Y <= 109). Faili teisel real on esimese masti koordinaadid X1 (0 <= X1 <= X) ja Y1 (0 <= Y1 <= Y ), mis näitavad, et mast on põllu vasakust otsast kaugusel X1 ja alumisest küljest kaugusel Y1. Faili kolmandal real on teise masti koordinaadid X2 ja Y2. Kõik arvud on täisarvud. Masti läbimõõt on põllu suurusega võrreldes nii väike, et seda pole vaja arvestada.

Väljund. Tekstifaili kurgid2.val ainsale reale väljastada täisarv S — otsitav pindala.

Näide. kurgid2.sis

10 5

4 1

8 4

kurgid2.val

32

Näide. kurgid2.sis

10 5

4 1

7 4

kurgid2.val

30

Alloleval joonisel on vasakul kujutatud esimese ja paremal teise näite lahendus.

clip_image001

Hindamine. Testides summaarse väärtusega 10 punkti on X <= 100 ja Y <= 100.


Kuna selle kohta initsiaalset (ka mittetöötavat) lahendust polnud siis siin on puhtalt minu lahendusvariant.

Code Snippet
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.   FILE *sisf;
  5.   FILE *valf;
  6.  
  7. int main(int argc, char *argv[])
  8. {
  9.   int  x, y, x1, y1, x2, y2;
  10.   int val[4];
  11.  
  12.   sisf = fopen( "kurgid2.sis", "r" );
  13.   fscanf( sisf, "%i %i\n%i %i\n%i %i", &x, &y, &x1, &y1, &x2, &y2 );
  14.  
  15.   val[0]= abs((x2-x1)*y);
  16.   val[1] = abs((y2-y1)*x);
  17.  
  18.   val[2] = x1>x2 ? (x-x2)*y1 : (x-x1)*y2;
  19.   val[3] = y1>y2 ? (y-y2)*x1 : (y-y1)*x2;
  20.  
  21.   int max = val[0];
  22.   for(int i=0; i<4;i++)
  23.       max = max < val[i] ? val[i] : max ;
  24.  
  25.    printf("Max on %i\n", max);
  26.  
  27.   valf = fopen("kurgid2.val", "w");  
  28.   fprintf(valf, "%i\n", max);  
  29.   fclose(valf);      
  30.   return 0;
  31. }

Comments (4) -

  • Simmo

    12/27/2011 3:19:26 PM | Reply

    See programm alati küll õiget tulemust ei leia.

    Olgu meil selline põld, kus X tähistab masti ning täidetud ruut suurimat ala:
    /---------\
    | | |.|.|.|
    -----------
    | | |.|.|.|
    -----------
    | | |.|.|.|
    ----X------
    | | |.|.|.|
    --X--------
    | | |.|.|.|
    \---------/

    See sisendfail oleks:
    5 5
    1 1
    2 2


    See programm aga annab suurimaks pindalaks 8, kuigi korrektne oleks 15. Viga on selles, et programm vaatab juhtumeid, kuid suurim pindala on nurgas või kahe masti vahel, kui suurim pindala võib olla ka masti ja põllu ääre vahel.

  • Leivo

    12/27/2011 3:35:47 PM | Reply

    Ja Sinu toodud variandi korral on ülesandel kaks õiget lahendust ning mõlemad masti ja serva vahel.


    /---------\
    |.|.|.|.|.|
    -----------
    |.|.|.|.|.|
    -----------
    |.|.|.|.|.|
    ----X------
    | | | | | |
    --X--------
    | | | | | |
    \---------/

  • Ramses

    12/29/2011 10:44:10 PM | Reply

    See on õige lahendus ülesandele. Sobib kõikide koordinaatidega mis sinna pannakse


    /*
    Autor:Ramses Sepp 29.12.2011
    See programm on 2011-a aasta informaatika
    olümpiaadi põhikooli eelvooru 2. ülesanne
    */
    task main()
    {

    //Põllu suurus
    int X = 6;
    int Y = 4;

    //1-e posti koordinaadid
    int x1 = 0;
    int y1 = 2;

    //2-e posti koordinaadid
    int x2 = 2;
    int y2 = 4;

    int max;
    int Tulemus[8];
    int temp;

    if(x1 > x2){
      temp = x2;
      x2 = x1;
      x1 = temp;
      temp = y2;
      y2 = y1;
      y1 = temp;
      }

    Tulemus[0] = abs((x2-x1)*Y);    //2 masti vahel vertikaalselt
    Tulemus[1] = abs((y2-y1)*X);    //2 masti vahel horisontaalselt

    if(y1 > y2){
      Tulemus[2] = x2*y1;            //2 mastiga vasakule alla
      Tulemus[3] = (X-x1)*(Y-y2);    //2 mastiga paremale üles
      Tulemus[4] = X*y2;            //alla
      Tulemus[5] = X*(Y-y1);        //üles
      }
    else{
      Tulemus[2] = (Y-y1)*x2;        //2 mastiga vasakule üles
      Tulemus[3] = (X-x1)*y2;        //2 mastiga paremale alla
      Tulemus[4] = X*y1;            //alla
      Tulemus[5] = X*(Y-y2);        //üles
      }

    Tulemus[6] = (X-x2)*Y;          //Parem
    Tulemus[7] = x1*Y;              //Vasak

    //maksimumi leidmine
    for(int i=0; i<8;i++)
      max = max < Tulemus[i] ? Tulemus[i] : max ;

    NumOut(45, LCD_LINE5, max);
    Wait(SEC_10);
    }

  • Rao Zvorovski

    12/30/2011 8:32:11 PM | Reply

    Ramsese laheńdusele failist võtmine ja faili panemine juurde pandud

    task main()
    {

    FILE *sisend, *valmis;
    int max;
    int Tulemus[8];
    int temp;

    sisend = fopen("kolmnurk.sis", "r");        
       fscanf(sisend, "%i %i", &X, &Y);
       fscanf(sisend, "%i %i", &x1, &1);      
       fscanf(sisend, "%i %i", &x2, &2);                  
       fclose(sisend);                  

    if(x1 > x2){
      temp = x2;
      x2 = x1;
      x1 = temp;
      temp = y2;
      y2 = y1;
      y1 = temp;
      }

    Tulemus[0] = abs((x2-x1)*Y);    //2 masti vahel vertikaalselt
    Tulemus[1] = abs((y2-y1)*X);    //2 masti vahel horisontaalselt

    if(y1 > y2){
      Tulemus[2] = x2*y1;            //2 mastiga vasakule alla
      Tulemus[3] = (X-x1)*(Y-y2);    //2 mastiga paremale üles
      Tulemus[4] = X*y2;            //alla
      Tulemus[5] = X*(Y-y1);        //üles
      }
    else{
      Tulemus[2] = (Y-y1)*x2;        //2 mastiga vasakule üles
      Tulemus[3] = (X-x1)*y2;        //2 mastiga paremale alla
      Tulemus[4] = X*y1;            //alla
      Tulemus[5] = X*(Y-y2);        //üles
      }

    Tulemus[6] = (X-x2)*Y;          //Parem
    Tulemus[7] = x1*Y;              //Vasak

    //maksimumi leidmine
    for(int i=0; i<8;i++)
      max = max < Tulemus[i] ? Tulemus[i] : max ;

       /* väljastame tulemuse */
       valmis = fopen("kurgid.val", "w");      
       fprintf(valmis, "%i\n", max);                          
       fclose(valmis);                                  
       return 0;

    }

Add comment

Loading