Guest User

Untitled

a guest
Apr 22nd, 2018
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.57 KB | None | 0 0
  1. #include<string.h>
  2. #include<stdlib.h>
  3. #include<stdio.h>
  4. #include<math.h>         
  5.  
  6.  
  7. typedef struct bases                        /*a bázis adatait tároló struktúra: a címe, meg a következőre mutató pointer*/
  8. {
  9.     unsigned int x;
  10.     unsigned int y;
  11.     struct bases *nbase;
  12. }base;     
  13. typedef struct gyereks
  14. {
  15.     int sm;                             /*sent money: az elküldött pénz*/
  16.     int ajándéklista[26];             /*az ajándék lista, a betűk ASCII kódjának megfelelő eltolásával, hogy azt megfeltetthessük az artombbel*/
  17.     unsigned int x;                     /*a házuk koordinátája*/
  18.     unsigned int y;
  19.     int szabad;                         /*igaz/hamis: feldolgoztuk-e már(később bővebben)*/
  20.     struct gyereks* ngyerek;            /*a következő gyerekre mutató pointer*/
  21. }gyerek;
  22. int artomb[26];
  23.  
  24.  
  25.  
  26. double tavolsag(unsigned ax, unsigned ay, unsigned bx, unsigned by)
  27. {
  28.     double osszeg=(ax-bx)*(ax-bx);
  29.     osszeg +=(ay-by)*(ay-by);
  30.     return sqrt(osszeg);
  31. }/////////tavolsag
  32.  
  33. int utikoltseg(double szam)                         /*a kapott szám felső egészrészét (megkezdett kilométerét) ceil függvény segítségével megadom, majd szorzom kettővel az egységár miatt*/
  34. {
  35.     int rcost=0;
  36.     double kerekitett=ceil((szam/1000));            /*rcost=road cost*/
  37.     return rcost=(int)2*kerekitett;
  38. }///////utikoltseg
  39.  
  40. base *new_base_list()                                   /*Új base elemekből álló listát hoz létre*/
  41. {
  42.     base *stre=(base*)malloc(sizeof (base));            /*Egy első és hátsó strázsát tartalmaz*/
  43.     base *stru=(base*)malloc(sizeof (base));
  44.     if(stre&&stru)
  45.     {
  46.         stre->x=0;
  47.         stre->y=0;
  48.         stre->nbase=stru;
  49.         stru->x=0;                                      /*A rendezés miatt célszerű 0-nak venni az értékait a hátsó strázsának*/
  50.         stru->y=0;
  51.         stru->nbase=NULL;
  52.         return stre;
  53.     }
  54.     else                                                /*Ha nem jött létre az egyik strázsa, akkor a másik se legyen már ott :D*/
  55.     {
  56.         if(!stru)
  57.             free(stre);
  58.         if(!stre)
  59.             free(stru);
  60.         return NULL;
  61.     }
  62. }//////////new_base_list
  63.  
  64. base *new_base(unsigned int h, unsigned int v)                  /*horizontal és vertical változókat kap a listaelemet feltöltő függvény*/
  65. {
  66.     base*helye=(base*)malloc(sizeof(base));
  67.     if(helye)                                                   /*ha le tudta foglalni és nem nullát adott vissza*/
  68.         helye->x=h;
  69.         helye->y=v;
  70.         helye->nbase=NULL;
  71.     return helye;
  72. }//////////new_base
  73.  
  74. base* add_base(base* stre)                                      /*Bázisokat beolvasó és tároló függvény*/
  75. {
  76.     unsigned int hori, verti, k, i=0;                                      
  77.     base *spot, *temp;                                          /*Mivel rendezem is egyből, kell ennyi változó*/
  78.     FILE *fp=fopen("BASE.DAT","rb");
  79.     if(!fp)                                                     /*Ha hibásan nyitná meg a filet:*/
  80.     {
  81.         printf("An error occured during the opening of the file.\n");
  82.         return 0;
  83.     }
  84.     while (fread (&k, sizeof (unsigned int), 1, fp) != 0)       /*A ciklus addig megy, amíg az fread nem ad vissza 0-t*/
  85.     {
  86.         if(i%2==0)     
  87.             verti=k;
  88.         else
  89.         {
  90.             hori=k;
  91.             temp=new_base(hori, verti);                         /*A rendezésnél a legkeletibb kell, az lesz az első elemem, hogy strázsa arra mutasson*/
  92.             spot=stre;                                          /*A rendezésnél mindig a lista első elemével kell kezdeni, hogy biztosan jó értéket adjon*/
  93.             for(spot; spot->nbase!=NULL; spot=spot->nbase)
  94.             {
  95.                 if(hori>spot->nbase->x)                         /*A legkeletibb bázist teszi az első helyre*/
  96.                 {
  97.                     temp->nbase=spot->nbase;
  98.                     spot->nbase=temp;
  99.                     break;                                      /*Ha nem break-elnék, akkor végtelen ciklusban maradna, mert a temp az nem NULL*/
  100.                 }
  101.             }
  102.         }          
  103.         i++;
  104.     }
  105.     fclose(fp);
  106.     return stre;                                                /*Az első elem címét kell visszaadni az eljárás végeztélvel.*/
  107. }//////// add_base
  108.  
  109. void arak()                                                     /*beolvassa fajlbol az egyes ajandekok arait, ezt pedig egy tombben tarolja*/
  110.  {
  111.         int i;
  112.         FILE *fp = fopen("PRICE.DAT", "rb");                    /*Globális változóba ovlassa be*/
  113.         if(!fp)
  114.         {
  115.             printf("An error occured during the opening of the file.\n");
  116.             exit(1);
  117.         }
  118.         for(i=0;i<26;i++)
  119.             fread(&artomb[i], sizeof(int), 1, fp);
  120.         fclose(fp);
  121.  }//////////arak
  122.  
  123. gyerek *new_gyerek_list()                                   /*Új base elemekből álló listát hoz létre*/
  124. {
  125.     gyerek *stre=(gyerek*)malloc(sizeof (gyerek));          /*Egy első és hátsó strázsát tartalmaz*/
  126.     gyerek *stru=(gyerek*)malloc(sizeof (gyerek));
  127.     if(stre&&stru)
  128.     {
  129.         int i;
  130.         stre->sm=0;                                         /*A strázsák minden elemét nullára, vagy NULL-ra veszem*/  
  131.         stre->x=0;                     
  132.         stre->y=0;
  133.         stre->szabad=1;                    
  134.         stre->ngyerek=stru;
  135.         for (i=0; i<26; i++)
  136.             stre->ajándéklista[i] = '\0';
  137.         stru->sm=0;                                
  138.         stru->x=0;                     
  139.         stru->y=0;
  140.         stru->szabad=1;                    
  141.         stru->ngyerek=NULL;
  142.         for (i=0; i<26; i++)
  143.             stru->ajándéklista[i] = '\0';
  144.         return stre;
  145.     }
  146.     else                                                    /*Ha nem jött létre az egyik strázsa, akkor a másik se legyen már ott :D*/
  147.     {
  148.         if(!stru)
  149.             free(stre);
  150.         if(!stre)
  151.             free(stru);
  152.         return NULL;
  153.     }
  154. }/////////////new_gyerek_list
  155.  
  156. gyerek *new_gyerek(unsigned int h, unsigned int v, unsigned sent_money, int ajlista[])      /*horizontal és vertical változókat kap a listaelemet feltöltő függvény*/
  157. {
  158.     gyerek*minden=(gyerek*)malloc(sizeof(gyerek));
  159.     if(minden)                                              /*ha le tudta foglalni és nem nullát adott vissza*/
  160.     {
  161.         int i;
  162.         for(i=0; i<26; i++)
  163.             minden->ajándéklista[i]=ajlista[i];
  164.         minden->x=h;
  165.         minden->y=v;
  166.         minden->sm=sent_money;
  167.         minden->ngyerek=NULL;
  168.         minden->szabad=1;
  169.  
  170.     }
  171.     return minden;
  172. }//////////new_gyerek
  173.  
  174. int base_distance(base* hova, base* east, unsigned verti, unsigned hori)    /*Meghatározza, hogy keleti bázishoz van-e a legközelebb a gyerek*/
  175. {
  176.     double dmin=1.79769e+308, d=0;                          /*distance rövidítések, a minimumot először a double-n tárolható maximális értéknek veszem*/
  177.     base* temp;
  178.     for(hova; hova->nbase!=NULL; hova=hova->nbase)          /*A hova-t léptetem végig, az eleinte a strázsára mutat, majd a távolság függvényemmel megadom a minimális távolságot.
  179.                                                             A strázsa értékével sem hasonlítom össze! A kapott értéket egy temp-ben tárolom, hogy ne break-eljek.*/
  180.     {
  181.         d=tavolsag(hova->x, hova->y, hori, verti);
  182.         if(d<=dmin)
  183.         {
  184.             dmin=d;
  185.             temp=hova;                                      /*Itt kibreak-elhetnék, de inkább kerülöm annak a használatát, ezért kerül egy temp-be a bázishoz tartozás*/
  186.         }
  187.     }
  188.     if(temp==east)
  189.     {
  190.         return 1;
  191.     }
  192.     return 0;
  193. }//////////base_distance
  194.  
  195. gyerek* add_gyerek(gyerek* stre, base* belso)               /*A gyerekkel*-al fog visszatérni, a base* (base elso röviden=belso) ahhoz kell, hogy csak azokat a gyerekeket
  196.                                                             vegyem fel, akik a legkeletibb bázishoz tartoznak (rendezés miatt az első elem a strázsa után)*/
  197. {
  198.     FILE* fp=fopen("GIFT.TXT", "rt");                                  
  199.     char c;                                                 /*ajándéklista, verti, hori és sm a file-ból kiolvasott: x,y koordináták és az elküldött pénz*/
  200.     int ajándéklista[26];
  201.     unsigned verti, hori, i, k=0, sm;
  202.     int igaz=0;
  203.     gyerek* temp=stre, *spot=stre;
  204.  
  205.     while(fscanf(fp,"%d %d\n", &verti, &hori)!=EOF)
  206.     {
  207.         for (i=0; i<26;i++) ajándéklista[i] = '\0';           /*kinullázza a tömböt*/
  208.         while((c = fgetc(fp)) && c != '\n')
  209.         {
  210.             if (c > 64)
  211.             {
  212.                 ajándéklista[k] = c - 65;                 /*ASCII kódolás szerint az A-tól való távolaságot mondja meg*/
  213.                 k++;                                        /*amikor megnézem, akkor csak a k-adik elemig kell néznem(a 0-ák miatt)*/
  214.  
  215.             }
  216.         }
  217.         k=0;
  218.         fscanf(fp, "%d", &sm);
  219.         if(igaz=base_distance(belso->nbase, belso->nbase, verti, hori)) /*Paraméterek: a belso az a bázis lista első strázsája, a rendezés miatt a belso->nbase a legkeletibb bázis. A többi pedig a két koordináta. Ha igaz a függvény értéke, akkor eltárolom a gyereket.*/
  220.         {
  221.             temp=new_gyerek(verti, hori, sm, ajándéklista);
  222.             temp->ngyerek=spot->ngyerek;                        /*A spot segítségével elrakom, majd */
  223.             spot->ngyerek=temp;
  224.             spot=spot->ngyerek;
  225.         }
  226.     }
  227.     return stre;
  228.     fclose(fp);
  229. }/////////////add_gyerek
  230.  
  231. gyerek* find_north_gyerek(gyerek* stre)
  232. {
  233.     gyerek* spot=stre->ngyerek, *temp=stre;                     /*Lépgeteő spot, segéd temp, ebben tárolom a visszaadandó gyerek címét*/
  234.     unsigned int max=0;
  235.     while(spot->ngyerek)
  236.     {
  237.         if(max<spot->x)
  238.         {
  239.             max=spot->x;
  240.             temp=spot;
  241.         }
  242.         spot=spot->ngyerek;
  243.     }
  244.     return temp;
  245. }/////////////find_north_gyerek
  246.  
  247. double bejaras(base* east, gyerek*elsoh, gyerek* north)         /*Visszatér a legészakibb gyerekhez tartozó út hosszával
  248.                                                                 változók: east: a keleti bázis, elsoh: az első nem strázs a gyerek listában, north: az északi gyerek*/
  249. {
  250.     double d=0, dmin=1.79769e+308;                              /*d a változó távolság, dmin pedig a minimum távolság: először a double-n tárolható maximális érték*/
  251.     gyerek* temp=elsoh, *spot=elsoh, *haz=elsoh;                /*elsoh-val megjegyzem az első elemet, ami majd a "rendezéseknél" lesz fontos, temp, spot és ház pedig szbadon változtatható változók*/
  252.     while(haz->ngyerek!=NULL)                                   /*megnézi az összes gyerek címét és kiválasztja a minimálisat*/
  253.     {
  254.         d=tavolsag(east->x, east->y, haz->x, haz->y);
  255.         if(d<=dmin)
  256.         {
  257.             dmin=d;
  258.             temp=haz;                                           /*Ha találtunk egy minimálisat, akkor azt eltároljuk*/
  259.         }
  260.         haz=haz->ngyerek;
  261.     }
  262.     temp->szabad=0;                                             /*A ciklus végén a minimálisnak át kell írni a szabad változóját 0-ra: ezzel jelzem, hogy abba a bázisba már nem mehet újra út*/
  263.     haz=temp;
  264.     for(haz; haz!=north; haz=temp)                              /*Mindegyik házból kell kiindulási pont egészen addig, amíg el nem érjük a keresett gyereket, akkor leállhat*/
  265.     {
  266.         spot=elsoh;                                             /*Az összehasonlítást mindig a lista első elemétől kell kezdeni, ezért a spot-ot visszaállítom*/
  267.         dmin=1.79769e+308;                                      /*maximálisra állítom a dmint, hogy biztos találjak rövidebb utat*/
  268.         while(spot->ngyerek!=NULL)                              /*Az összes gyerekkel összehasonlítom a kiválaszottat (haz), feltéve, hogy a szabad=1, tehát még nem vezetett bele út*/
  269.         {
  270.             if(spot->szabad)
  271.             {
  272.                 d=tavolsag(haz->x, haz->y, spot->x, spot->y);
  273.                 if(d<=dmin)
  274.                 {
  275.                     dmin=d;
  276.                     temp=spot;
  277.                 }
  278.             }
  279.             spot=spot->ngyerek;
  280.         }
  281.         temp->szabad=0;                                         /*A temp-be tárolom a szükséges adatot*/
  282.     }
  283.     return dmin;                                                /*Amikor leáll a nagy for ciklus, akkor pont a north-ba mutató út hosszát fogja a dmin tartalmazni és épp arra van szükségünk.*/
  284. }//////////// bejaras
  285.  
  286. int osszkoltseg(gyerek *north, int uk)                          /*északi gyerek és útikötlség*/
  287. {
  288.     int osszeg=0m k;
  289.     artomb[i]=north->ajándéklista[i]
  290.     for(k=0; k<i; k++)
  291.  
  292.    
  293.  
  294.  
  295. }////// osszkoltseg
  296.  
  297. int main()
  298. {
  299.     double uthossz=0;
  300.     gyerek* gyp, *gylista, *north;
  301.     base* bp, *blista;
  302.     bp=new_base_list();
  303.     blista=add_base(bp);
  304.     gyp=new_gyerek_list();
  305.     gylista=add_gyerek(gyp, bp);
  306.     north=find_north_gyerek(gyp);
  307.     uthossz=bejaras(bp->nbase, gyp->ngyerek, north);
  308.     return 0;
  309. }
Add Comment
Please, Sign In to add comment