home *** CD-ROM | disk | FTP | other *** search
/ PC World 2002 December / PCWorld_2002-12_cd.bin / Software / Komercni / Baltik / katB.exe / katB / BACKTRAQ / BACKTRAQ.MOD / STANICE.INC < prev    next >
Text File  |  2002-09-25  |  29KB  |  492 lines

  1. // soukromé konstanty
  2.  
  3. // soukromé prom╪nné
  4.  
  5. int modStanice_MaximálníHmotnost; // celková hmotnost nákladu, kter∞ màºe kamion vézt
  6. int modStanice_ObsazenáHmotnost; // jiº obsazená hmotnost v kamionu
  7. int modStanice_PoƒetZboºí; // poƒet zboºí, které je k dispozici
  8. int *modStanice_Zboºí; // pole zboºí, které je k dispozici - hodnoty prvkà urƒují hmotnosti jednotliv∞ch kusà zboºí
  9.  
  10. int modStanice_DostupnáHmotnost; // dostupná hmotnost v kamionu (= modStanice_MaximálníHmotnost - modStanice_ObsazenáHmotnost) ... ukládáno v prom╪nné pro urychlení v∞poƒtu
  11.  
  12. int *modStanice_Kamion; // pole zboºí nakládaného do kamionu - jednotlivé prvky jsou po²adová ƒísla naloºen∞ch kusà zboºí
  13. int modStanice_NaloºenáHmotnost; // celková hmotnost nákladu, kter∞ je práv╪ naloºen∞
  14. int modStanice_Θroveσ; // úroveσ zano²ení v backtrackingu (kolik zboºí je práv╪ naloºeno)
  15. int *modStanice_Nejlepτíⁿeτení_Kamion; // kopie pole Kamion, které je dosud nejlepτím nalezen∞m ²eτením
  16. int modStanice_Nejlepτíⁿeτení_NaloºenáHmotnost; // celková hmotnost nákladu, kter∞ je dosud nejlepτím nalezen∞m ²eτením
  17. int modStanice_Nejlepτíⁿeτení_Θroveσ; // úroveσ zano²ení v backtrackingu (kolik zboºí je práv╪ naloºeno), která byla aktuální v dob╪ nalezení dosud nejlepτího nalezeného ²eτení
  18.  
  19. // soukromé funkce
  20.  
  21. void modStanice_VykresliKamion(void) {
  22.   GrKresliP²edm╪ty(46,0,25,120,15,7);
  23.   }
  24.  
  25. void modStanice_VykresliZboºí(int *modStanice_VykreslovanéPole, int modStanice_VykreslovanáΘroveσ) {
  26.   int modStanice_VykreslovanáHmotnost, modStanice_JiºVykreslenáHmotnost = 0;
  27.   double modStanice_HmotnostNaObrazovkov∞Sloupec = modStanice_MaximálníHmotnost / 402.0;
  28.   int modStanice_Vykreslovan∞Obdélník_X1, modStanice_Vykreslovan∞Obdélník_X2;
  29.   ¼ekejNaVR();
  30.   GrNastavBarvuPozadí(PalSv╪tleµedá);
  31.   GrKresliVypln╪n∞Obdélník(25+148,120+14,25+148+401,120+141); // vyprázdn╪ní nákladního prostoru
  32.   // vykreslení hranice dosud nejlepτího nalezeného ²eτení
  33.   if(modStanice_Nejlepτíⁿeτení_NaloºenáHmotnost > 0 && modStanice_VykreslovanéPole != modStanice_Nejlepτíⁿeτení_Kamion) {
  34.     GrNastavBarvuPop²edí(Pal¼ervená);
  35.     modStanice_VykreslovanáHmotnost = modStanice_ObsazenáHmotnost + modStanice_Nejlepτíⁿeτení_NaloºenáHmotnost;
  36.     int modStanice_VykreslovanáHraniceNejlepτíhoⁿeτení = integer(modStanice_VykreslovanáHmotnost / modStanice_HmotnostNaObrazovkov∞Sloupec) + (frac(modStanice_VykreslovanáHmotnost / modStanice_HmotnostNaObrazovkov∞Sloupec) == 0.0 ? 0 : 1) - 1;
  37.     GrKresliLinku(25+148+modStanice_VykreslovanáHraniceNejlepτíhoⁿeτení,
  38.                   120+14,
  39.                   25+148+modStanice_VykreslovanáHraniceNejlepτíhoⁿeτení,
  40.                   120+141);
  41.     }
  42.   // vykreslení jednotliv∞ch kusà zboºí naloºen∞ch v kamionu
  43.   int modStanice_VykreslovanéZboºí;
  44.   for(modStanice_VykreslovanéZboºí=-1; modStanice_VykreslovanéZboºí<=(modStanice_VykreslovanéPole?modStanice_VykreslovanáΘroveσ:-1); modStanice_VykreslovanéZboºí++) {
  45.     if(modStanice_VykreslovanéZboºí == -1) modStanice_VykreslovanáHmotnost = modStanice_ObsazenáHmotnost;
  46.     else modStanice_VykreslovanáHmotnost = modStanice_Zboºí[modStanice_VykreslovanéPole[modStanice_VykreslovanéZboºí]];
  47.     modStanice_Vykreslovan∞Obdélník_X1 = integer(modStanice_JiºVykreslenáHmotnost / modStanice_HmotnostNaObrazovkov∞Sloupec);
  48.     modStanice_Vykreslovan∞Obdélník_X2 = modStanice_Vykreslovan∞Obdélník_X1 + integer(modStanice_VykreslovanáHmotnost / modStanice_HmotnostNaObrazovkov∞Sloupec) + (frac(modStanice_VykreslovanáHmotnost / modStanice_HmotnostNaObrazovkov∞Sloupec) == 0.0 ? 0 : 1) - 1;
  49.     if(modStanice_Vykreslovan∞Obdélník_X2 >= modStanice_Vykreslovan∞Obdélník_X1) {
  50.       // dále se pokraƒuje pouze tehdy, pokud je co vykreslovat (vykreslovan∞ obdélník je alespoσ pixel τirok∞)
  51.       if(modStanice_Vykreslovan∞Obdélník_X2 > 401) modStanice_Vykreslovan∞Obdélník_X2 = 401;
  52.       if(modStanice_VykreslovanéZboºí == -1) {
  53.         // vykresluje se obsazená hmotnost
  54.         GrNastavBarvuPozadí(PalTmav╪µedá);
  55.         }
  56.       else if(modStanice_JiºVykreslenáHmotnost + modStanice_VykreslovanáHmotnost > modStanice_MaximálníHmotnost) {
  57.         // vykresluje se zboºí o hmotnosti, která se jiº celá do kamionu nevejde
  58.         GrNastavBarvuPozadí(Pal¼ervená);
  59.         }
  60.       else {
  61.         // vykresluje se b╪ºné zboºí
  62.         GrNastavBarvuPozadí(modStanice_VykreslovanéZboºí%2==0?PalTmav╪Modrá:PalSv╪tleModrá);
  63.         }
  64.       GrKresliVypln╪n∞Obdélník(25+148+modStanice_Vykreslovan∞Obdélník_X1,
  65.                                120+14,
  66.                                25+148+modStanice_Vykreslovan∞Obdélník_X2,
  67.                                120+141);
  68.       }
  69.     if((modStanice_JiºVykreslenáHmotnost += modStanice_VykreslovanáHmotnost) >= modStanice_MaximálníHmotnost) break;
  70.     }
  71.   }
  72.  
  73. string modStanice_PoleZboºíNaⁿet╪zec(int *modStanice_P²evád╪néPole, int *modStanice_P²evád╪náΘroveσ, int *modStanice_P²evád╪náHmotnost) {
  74.   string modStanice_Vrátit = "";
  75.   int modStanice_P²evád╪n∞Prvek;
  76.   for(modStanice_P²evád╪n∞Prvek=0; modStanice_P²evád╪n∞Prvek<=*modStanice_P²evád╪náΘroveσ; modStanice_P²evád╪n∞Prvek++) {
  77.     modStanice_Vrátit += StrL¼íslo(modStanice_Zboºí[modStanice_P²evád╪néPole[modStanice_P²evád╪n∞Prvek]],-1)+" ";
  78.     }
  79.   modStanice_Vrátit += "(celkem "+StrL¼íslo(*modStanice_P²evád╪náHmotnost,-1)+")";
  80.   return modStanice_Vrátit;
  81.   }
  82.  
  83. // ve²ejné funkce
  84.  
  85. void modStanice_Start(void) {
  86.   // v p²ípad╪ grafického reºimu:
  87.   if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) {
  88.     // smazání obrazovky
  89.     GrSmaºOkno();
  90.     // vykreslení kamionu
  91.     modStanice_VykresliKamion();
  92.     // vykreslení prázdného nákladního prostoru kamionu
  93.     modStanice_VykresliZboºí(0, 0);
  94.     }
  95.  
  96.   mod_VypiτHláτku("Po stisknutí klávesy nebo tlaƒítka myτi se rozb╪hne v∞poƒet...", mod_VYPIµHL╡µKU_NE¼EKEJ);
  97.   VyprázdniFrontuKláves(); MyτZapni();
  98.   ¼ekej(NaKlávesu|NaMyτ);
  99.   VyprázdniFrontuKláves(); MyτVypni();
  100.  
  101.   // smazání obrazovky v p²ípad╪ textového reºimu
  102.   if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  103.     TxtSmaºObrazovku();
  104.     }
  105.  
  106.   mod_VypiτHláτku("Probíhá v∞poƒet...", mod_VYPIµHL╡µKU_NE¼EKEJ);
  107.  
  108.   // zaznamenání ƒasu startu v∞poƒtu
  109.   Systémov∞¼as(mod_¼asStart);
  110.  
  111.   // inicializace prom╪nn∞ch pouºívan∞ch v∞poƒtem
  112.   mod_HledatDál = 1;
  113.   modStanice_Θroveσ = 0;
  114.   modStanice_NaloºenáHmotnost = 0;
  115.   modStanice_Nejlepτíⁿeτení_Θroveσ = 0;
  116.   modStanice_Nejlepτíⁿeτení_NaloºenáHmotnost = 0;
  117.  
  118.   // zapsání parametrà v∞poƒtu do souboru, pokud si to uºivatel p²ál
  119.   if(mod_ZapisovatProtokol) {
  120.     mod_ProtokolZapiτStart1();
  121.     SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Reºim obrazovky: "+(mod_ReºimObrazovky==mod_TEXTOVφ_REªIM?"textov∞":"grafick∞")+"\n");
  122.     SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Maximální hmotnost nákladu kamionu: "+StrL¼íslo(modStanice_MaximálníHmotnost,-1)+" kg\n");
  123.     SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Obsazená hmotnost kamionu: "+StrL¼íslo(modStanice_ObsazenáHmotnost,-1)+" kg\n");
  124.     SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Poƒet kusà zboºí k dispozici: "+StrL¼íslo(modStanice_PoƒetZboºí,-1)+"\n");
  125.     SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Hmotnosti jednotliv∞ch kusà zboºí [kg]: ");
  126.     int modStanice_ProcházenéZboºí;
  127.     for(modStanice_ProcházenéZboºí=0; modStanice_ProcházenéZboºí<modStanice_PoƒetZboºí; modStanice_ProcházenéZboºí++) SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, StrL¼íslo(modStanice_Zboºí[modStanice_ProcházenéZboºí],-1)+" ");
  128.     SouborPiτNov∞ⁿádek(mod_ZapisovatProtokol_Soubor);
  129.     SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Zobrazované pozice: "+(mod_ZobrazovanéPozice==mod_POUZE_ⁿEµEN╓?"jen nalezená ²eτení":"i pràb╪h hledání")+"\n");
  130.     SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Vyƒkat po nalezení nového nejlepτího ²eτení na stisk klávesy: "+(mod_¼ekatNaKlávesu?"ano":"ne")+"\n");
  131.     SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Zapisovat protokol o v∞poƒtu: "+(mod_ZapisovatProtokol?"ano":"ne")+"\n");
  132.     SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Soubor protokolu: "+mod_ZapisovatProtokol_Název+"\n");
  133.     mod_ProtokolZapiτStart2();
  134.     }
  135.   }
  136.  
  137. void modStanice_Hotovo(void) {
  138.   int modStanice_ProcházenéZboºí;
  139.   // uloºení ƒasu dokonƒení v∞poƒtu
  140.   Systémov∞¼as(mod_¼asHotovo);
  141.   // p²ekreslení zboºí - vykreslení prázdného nákladního prostoru
  142.   if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) {
  143.     modStanice_VykresliZboºí(0, 0);
  144.     }
  145.   // v p²ípad╪ grafického reºimu pípnutí - oznámení dokonƒení v∞poƒtu
  146.   if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) { Tón(1000); ¼ekej(1500); VypniTón(); }
  147.   // pokud bylo vàbec nalezeno n╪jaké nejlepτí ²eτení
  148.   if(modStanice_Nejlepτíⁿeτení_NaloºenáHmotnost > 0) {
  149.     // p²ekreslení zboºí - vykreslení nejlepτího nalezeného ²eτení
  150.     if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) {
  151.       modStanice_VykresliZboºí(modStanice_Nejlepτíⁿeτení_Kamion, modStanice_Nejlepτíⁿeτení_Θroveσ);
  152.       }
  153.     }
  154.   // v∞poƒet doby trvání v∞poƒtu
  155.   mod_V∞poƒetDobyTrváníV∞poƒtu();
  156.   // zobrazení doby trvání v∞poƒtu
  157.   mod_VypiτHláτku("Hotovo. Délka: "+StrL¼ísloZeroPad(mod_¼asRozdíl.Hodiny,2)+":"+StrL¼ísloZeroPad(mod_¼asRozdíl.Minuty,2)+":"+StrL¼ísloZeroPad(mod_¼asRozdíl.Sekundy,2)+"."+StrL¼ísloZeroPad(mod_¼asRozdíl.Setiny,2)+"...", mod_VYPIµHL╡µKU_¼EKEJNAKL╡VESUGRAFIKA);
  158.   // zapsání informací t∞kajících se dokonƒení v∞poƒtu do souboru, pokud si to uºivatel p²ál
  159.   if(mod_ZapisovatProtokol) {
  160.     // pokud bylo vàbec nalezeno n╪jaké nejlepτí ²eτení
  161.     if(modStanice_Nejlepτíⁿeτení_NaloºenáHmotnost > 0) {
  162.       SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "NEJLEPµ╓ ⁿEµEN╓: ");
  163.       SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, modStanice_PoleZboºíNaⁿet╪zec(modStanice_Nejlepτíⁿeτení_Kamion, &modStanice_Nejlepτíⁿeτení_Θroveσ, &modStanice_Nejlepτíⁿeτení_NaloºenáHmotnost));
  164.       SouborPiτNov∞ⁿádek(mod_ZapisovatProtokol_Soubor);
  165.       }
  166.     // jinak pokud nebylo nalezeno ºádné nejlepτí ²eτení
  167.     else {
  168.       SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Nebylo nalezeno ºádné ²eτení.\n");
  169.       }
  170.     SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Hotovo: "+StrL¼ísloZeroPad(mod_¼asHotovo.Hodiny,2)+":"+StrL¼ísloZeroPad(mod_¼asHotovo.Minuty,2)+":"+StrL¼ísloZeroPad(mod_¼asHotovo.Sekundy,2)+"."+StrL¼ísloZeroPad(mod_¼asHotovo.Setiny,2)+"\n");
  171.     SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Délka v∞poƒtu: "+StrL¼ísloZeroPad(mod_¼asRozdíl.Hodiny,2)+":"+StrL¼ísloZeroPad(mod_¼asRozdíl.Minuty,2)+":"+StrL¼ísloZeroPad(mod_¼asRozdíl.Sekundy,2)+"."+StrL¼ísloZeroPad(mod_¼asRozdíl.Setiny,2)+"\n");
  172.     mod_ProtokolZapiτHotovo();
  173.     }
  174.   // pokud bylo vàbec nalezeno n╪jaké nejlepτí ²eτení
  175.   if(modStanice_Nejlepτíⁿeτení_NaloºenáHmotnost > 0) {
  176.     mod_VypiτHláτku("NEJLEPµ╓ ⁿEµEN╓: " + modStanice_PoleZboºíNaⁿet╪zec(modStanice_Nejlepτíⁿeτení_Kamion, &modStanice_Nejlepτíⁿeτení_Θroveσ, &modStanice_Nejlepτíⁿeτení_NaloºenáHmotnost), mod_VYPIµHL╡µKU_¼EKEJNAKL╡VESU);
  177.     }
  178.   // jinak pokud nebylo nalezeno ºádné nejlepτí ²eτení
  179.   else {
  180.     mod_VypiτHláτku("Nebylo nalezeno ºádné ²eτení.", mod_VYPIµHL╡µKU_¼EKEJNAKL╡VESU);
  181.     }
  182.   }
  183.  
  184. void modStanice_Θklid(void) {
  185.   // uvoln╪ní pam╪ti pouºité pro pole zboºí
  186.   HromadaUvolniPam╪£(modStanice_Zboºí);
  187.   // uvoln╪ní pam╪ti pouºité pro pole kamionu
  188.   HromadaUvolniPam╪£(modStanice_Kamion);
  189.   // uvoln╪ní pam╪ti pouºité pro pole nejlepτího ²eτení
  190.   HromadaUvolniPam╪£(modStanice_Nejlepτíⁿeτení_Kamion);
  191.   }
  192.  
  193. void modStanice_ZadáníVstupu(void) {
  194.   // INICIALIZACE REªIMU OBRAZOVKY
  195.   if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  196.     // p²epnutí do textového reºimu
  197.     P²epniNaText();
  198.     }
  199.   else if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) {
  200.     GrSmaºOkno();
  201.     }
  202.  
  203.   // INFORMACE O REªIMU OBRAZOVKY
  204.   if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  205.     mod_VypiτHláτku("Pouºívám textov∞ reºim...", mod_VYPIµHL╡µKU_VY¼KEJ);
  206.     }
  207.   else if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) {
  208.     mod_VypiτHláτku("Pouºívám grafick∞ reºim...", mod_VYPIµHL╡µKU_VY¼KEJ);
  209.     }
  210.  
  211.   // ZJIµT╖N╓ MAXIM╡LN╓ HMOTNOSTI N╡KLADU
  212.   mod_VypiτHláτku("Zadejte maximální hmotnost nákladu kamionu v cel∞ch kg [0-10000]: ", mod_VYPIµHL╡µKU_NE¼EKEJ);
  213.   if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  214.     while((VyprázdniFrontuKláves(),Txt¼tiI¼íslo(modStanice_MaximálníHmotnost)) || modStanice_MaximálníHmotnost < 0 || modStanice_MaximálníHmotnost > 10000);
  215.     }
  216.   else if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) {
  217.     GrNastavV∞stup(mod_GRAFIKA_VφSTUP_POKYN);
  218.     while((VyprázdniFrontuKláves(),Gr¼tiI¼íslo("",modStanice_MaximálníHmotnost,5,0,PalTmav╪Modrá<<4|Palªlutá)) || modStanice_MaximálníHmotnost < 0 || modStanice_MaximálníHmotnost > 10000);
  219.     GrNastavV∞stup(mod_GRAFIKA_VφSTUP_MOJEPLOCHA);
  220.     }                                                                                                                                                                                                                                                                                   if(modStanice_MaximálníHmotnost==911) mod_VypiτHláτku("This module created 9/11/2002 - remembrance of 9/11/2001 - God Bless America!", mod_VYPIµHL╡µKU_¼EKEJNAKL╡VESU);
  221.  
  222.   // INFORMACE O MAXIM╡LN╓ HMOTNOSTI N╡KLADU
  223.   if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  224.     mod_VypiτHláτku("Maximální hmotnost nákladu kamionu je "+StrL¼íslo(modStanice_MaximálníHmotnost,-1)+" kg...", mod_VYPIµHL╡µKU_VY¼KEJ);
  225.     }
  226.  
  227.   // ZJIµT╖N╓ OBSAZENÉ HMOTNOSTI
  228.   mod_VypiτHláτku("Zadejte, kolik kg z této hmotnosti je jiº obsazeno nákladem [0-"+StrL¼íslo(modStanice_MaximálníHmotnost,-1)+"]: ", mod_VYPIµHL╡µKU_NE¼EKEJ);
  229.   if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  230.     while((VyprázdniFrontuKláves(),Txt¼tiI¼íslo(modStanice_ObsazenáHmotnost)) || modStanice_ObsazenáHmotnost < 0 || modStanice_ObsazenáHmotnost > modStanice_MaximálníHmotnost);
  231.     }
  232.   else if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) {
  233.     GrNastavV∞stup(mod_GRAFIKA_VφSTUP_POKYN);
  234.     while((VyprázdniFrontuKláves(),Gr¼tiI¼íslo("",modStanice_ObsazenáHmotnost,5,0,PalTmav╪Modrá<<4|Palªlutá)) || modStanice_ObsazenáHmotnost < 0 || modStanice_ObsazenáHmotnost > modStanice_MaximálníHmotnost);
  235.     GrNastavV∞stup(mod_GRAFIKA_VφSTUP_MOJEPLOCHA);
  236.     }
  237.  
  238.   // INFORMACE O OBSAZENÉ HMOTNOSTI
  239.   if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  240.     mod_VypiτHláτku("Obsazená hmotnost kamionu je "+StrL¼íslo(modStanice_ObsazenáHmotnost,-1)+" kg...", mod_VYPIµHL╡µKU_VY¼KEJ);
  241.     }
  242.  
  243.   // VYPO¼╓T╡N╓ DOSTUPNÉ HMOTNOSTI (MAXIM╡LN╓ - OBSAZEN╡)
  244.   modStanice_DostupnáHmotnost = modStanice_MaximálníHmotnost - modStanice_ObsazenáHmotnost;
  245.  
  246.   // ZJIµT╖N╓ PO¼TU KUS▐ ZBOª╓, KTERÉ JE K DISPOZICI
  247.   mod_VypiτHláτku("Zadejte, kolik kusà zboºí je ve vyt╪ºovací stanici k dispozici [0-100]: ", mod_VYPIµHL╡µKU_NE¼EKEJ);
  248.   if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  249.     while((VyprázdniFrontuKláves(),Txt¼tiI¼íslo(modStanice_PoƒetZboºí)) || modStanice_PoƒetZboºí < 0 || modStanice_PoƒetZboºí > 100);
  250.     }
  251.   else if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) {
  252.     GrNastavV∞stup(mod_GRAFIKA_VφSTUP_POKYN);
  253.     while((VyprázdniFrontuKláves(),Gr¼tiI¼íslo("",modStanice_PoƒetZboºí,3,0,PalTmav╪Modrá<<4|Palªlutá)) || modStanice_PoƒetZboºí < 0 || modStanice_PoƒetZboºí > 100);
  254.     GrNastavV∞stup(mod_GRAFIKA_VφSTUP_MOJEPLOCHA);
  255.     }
  256.  
  257.   // INFORMACE O PO¼TU KUS▐ ZBOª╓, KTERÉ JE K DISPOZICI
  258.   if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  259.     mod_VypiτHláτku("Ve vyt╪ºovací stanici je k dispozici "+StrL¼íslo(modStanice_PoƒetZboºí,-1)+" kusà zboºí...", mod_VYPIµHL╡µKU_VY¼KEJ);
  260.     }
  261.  
  262.   // Pⁿ╓PRAVA POLE ZBOª╓
  263.   // alokace pam╪ti pro pole
  264.   modStanice_Zboºí = (int*)HromadaAlokujPam╪£(modStanice_PoƒetZboºí*sizeof(modStanice_Zboºí[0]));
  265.   // vynulování vτech prvkà pole
  266.   memset(modStanice_Zboºí, 0, modStanice_PoƒetZboºí*sizeof(modStanice_Zboºí[0]));
  267.  
  268.   // Pⁿ╓PRAVA POLE KAMIONU
  269.   // alokace pam╪ti pro pole
  270.   modStanice_Kamion = (int*)HromadaAlokujPam╪£(modStanice_PoƒetZboºí*sizeof(modStanice_Kamion[0]));
  271.   // vynulování vτech prvkà pole
  272.   memset(modStanice_Kamion, 0, modStanice_PoƒetZboºí*sizeof(modStanice_Kamion[0]));
  273.  
  274.   // Pⁿ╓PRAVA POLE NEJLEPµ╓HO ⁿEµEN╓
  275.   // alokace pam╪ti pro pole
  276.   modStanice_Nejlepτíⁿeτení_Kamion = (int*)HromadaAlokujPam╪£(modStanice_PoƒetZboºí*sizeof(modStanice_Nejlepτíⁿeτení_Kamion[0]));
  277.   // vynulování vτech prvkà pole
  278.   memset(modStanice_Nejlepτíⁿeτení_Kamion, 0, modStanice_PoƒetZboºí*sizeof(modStanice_Nejlepτíⁿeτení_Kamion[0]));
  279.  
  280.   // ZJIµT╖N╓ HMOTNOST╓ JEDNOTLIVφCH KUS▐ ZBOª╓, KTERÉ JSOU K DISPOZICI
  281.   int modStanice_ZadávanéZboºí;
  282.   for(modStanice_ZadávanéZboºí=0; modStanice_ZadávanéZboºí<modStanice_PoƒetZboºí; modStanice_ZadávanéZboºí++) {
  283.     // ZJIµT╖N╓ HMOTNOSTI PR╡V╖ ZAD╡VANÉHO KUSU ZBOª╓
  284.     mod_VypiτHláτku("Zadejte hmotnost "+StrL¼íslo(modStanice_ZadávanéZboºí+1,-1)+". kusu zboºí v cel∞ch kg [0-10000]: ", mod_VYPIµHL╡µKU_NE¼EKEJ);
  285.     if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  286.       while((VyprázdniFrontuKláves(),Txt¼tiI¼íslo(modStanice_Zboºí[modStanice_ZadávanéZboºí])) || modStanice_Zboºí[modStanice_ZadávanéZboºí] < 0 || modStanice_Zboºí[modStanice_ZadávanéZboºí] > 10000);
  287.       }
  288.     else if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) {
  289.       GrNastavV∞stup(mod_GRAFIKA_VφSTUP_POKYN);
  290.       while((VyprázdniFrontuKláves(),Gr¼tiI¼íslo("",modStanice_Zboºí[modStanice_ZadávanéZboºí],5,0,PalTmav╪Modrá<<4|Palªlutá)) || modStanice_Zboºí[modStanice_ZadávanéZboºí] < 0 || modStanice_Zboºí[modStanice_ZadávanéZboºí] > 10000);
  291.       GrNastavV∞stup(mod_GRAFIKA_VφSTUP_MOJEPLOCHA);
  292.       }
  293.  
  294.     // INFORMACE O HMOTNOSTI PR╡V╖ ZAD╡VANÉHO KUSU ZBOª╓
  295.     if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  296.       mod_VypiτHláτku("Hmotnost "+StrL¼íslo(modStanice_ZadávanéZboºí+1,-1)+". kusu zboºí je "+StrL¼íslo(modStanice_Zboºí[modStanice_ZadávanéZboºí],-1)+" kg...", mod_VYPIµHL╡µKU_VY¼KEJ);
  297.       }
  298.     }
  299.  
  300.   // ZJIµT╖N╓, KTERÉ POZICE ZOBRAZOVAT
  301.   mod_NechZvolit_Volby[0] = "jen ²eτení"; mod_NechZvolit_AccessKeys[0] = '²';
  302.   mod_NechZvolit_Volby[1] = "i pràb╪h hledání"; mod_NechZvolit_AccessKeys[1] = 'p';
  303.   switch(mod_NechZvolit("Zobrazovat jen nalezená ²eτení nebo i pràb╪h hledání (upozorn╪ní: pomalé)?")) {
  304.     case 0: mod_ZobrazovanéPozice = mod_POUZE_ⁿEµEN╓; break;
  305.     case 1: mod_ZobrazovanéPozice = mod_VµECHNY_POZICE; break;
  306.     }
  307.  
  308.   // INFORMACE O TOM, KTERÉ POZICE ZOBRAZOVAT
  309.   if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  310.     mod_VypiτHláτku("Budu zobrazovat "+(mod_ZobrazovanéPozice==mod_POUZE_ⁿEµEN╓?"jen nalezená ²eτení":"i pràb╪h hledání")+"...", mod_VYPIµHL╡µKU_VY¼KEJ);
  311.     }
  312.  
  313.   // ZJIµT╖N╓, ZDA ¼EKAT PO NALEZEN╓ NOVÉHO NEJLEPµ╓HO ⁿEµEN╓ NA STISK KL╡VESY
  314.   if(mod_ZobrazovanéPozice == mod_POUZE_ⁿEµEN╓) {
  315.     // pokud se zobrazuje pouze v∞sledné nalezené ²eτení, po nalezení jednotliv∞ch nov∞ch nejlepτích ²eτení se nikdy neƒeká
  316.     mod_¼ekatNaKlávesu = 0;
  317.     }
  318.   else {
  319.     mod_NechZvolit_Volby[0] = "ano, vyƒkat"; mod_NechZvolit_AccessKeys[0] = 'a';
  320.     mod_NechZvolit_Volby[1] = "ne, neƒekat"; mod_NechZvolit_AccessKeys[1] = 'n';
  321.     switch(mod_NechZvolit("Vyƒkat po nalezení nového nejlepτího ²eτení na stisknutí klávesy?")) {
  322.       case 0: mod_¼ekatNaKlávesu = 1; break;
  323.       case 1: mod_¼ekatNaKlávesu = 0; break;
  324.       }
  325.  
  326.     // INFORMACE O TOM, ZDA PO NALEZEN╓ NOVÉHO NEJLEPµ╓HO ⁿEµEN╓ ¼EKAT NA STISK KL╡VESY
  327.     if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  328.       mod_VypiτHláτku("Po nalezení nového nejlepτího ²eτení "+(mod_¼ekatNaKlávesu?"budu":"nebudu")+" ƒekat na stisk klávesy...", mod_VYPIµHL╡µKU_VY¼KEJ);
  329.       }
  330.     }
  331.  
  332.   // ZJIµT╖N╓, ZDA ZAPISOVAT PROTOKOL O VφPO¼TU DO SOUBORU
  333.   mod_NechZvolit_Volby[0] = "ano, zapisovat"; mod_NechZvolit_AccessKeys[0] = 'a';
  334.   mod_NechZvolit_Volby[1] = "ne, nezapisovat"; mod_NechZvolit_AccessKeys[1] = 'n';
  335.   switch(mod_NechZvolit("Zapisovat protokol o v∞poƒtu do souboru?")) {
  336.     case 0: mod_ZapisovatProtokol = 1; break;
  337.     case 1: mod_ZapisovatProtokol = 0; break;
  338.     }
  339.  
  340.   // INFORMACE O TOM, ZDA ZAPISOVAT PROTOKOL O VφPO¼TU DO SOUBORU
  341.   if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  342.     mod_VypiτHláτku("Protokol o v∞poƒtu "+(mod_ZapisovatProtokol?"budu":"nebudu")+" zapisovat do souboru...", mod_VYPIµHL╡µKU_VY¼KEJ);
  343.     }
  344.  
  345.   if(mod_ZapisovatProtokol) {
  346.     // ZJIµT╖N╓ N╡ZVU SOUBORU, KAM ZAPISOVAT PROTOKOL O VφPO¼TU
  347.     mod_VypiτHláτku("Zadejte název souboru: ", mod_VYPIµHL╡µKU_NE¼EKEJ);
  348.     mod_ZapisovatProtokol_Název = "";
  349.     if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  350.       Txtⁿádkov∞Editor(mod_ZapisovatProtokol_Název,50,50,-1,0);
  351.       TxtPiτNov∞ⁿádek();
  352.       }
  353.     else if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) {
  354.       GrNastavV∞stup(mod_GRAFIKA_VφSTUP_POKYN);
  355.       VyprázdniFrontuKláves();
  356.       Grⁿádkov∞Editor(mod_ZapisovatProtokol_Název,50,-1,0,-1,PalTmav╪Modrá<<4|Palªlutá);
  357.       GrNastavV∞stup(mod_GRAFIKA_VφSTUP_MOJEPLOCHA);
  358.       }
  359.     if(StrKopie(mod_ZapisovatProtokol_Název, 1, 1) != ":") mod_ZapisovatProtokol_Název = "*\\" + mod_ZapisovatProtokol_Název;
  360.  
  361.     // INFORMACE O N╡ZVU SOUBORU, KAM ZAPISOVAT PROTOKOL O VφPO¼TU
  362.     if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  363.       mod_VypiτHláτku("Zvolen soubor "+mod_ZapisovatProtokol_Název+"...", mod_VYPIµHL╡µKU_VY¼KEJ);
  364.       }
  365.     }
  366.   }
  367.  
  368. void modStanice_OptimalizaceVstupu(void) {
  369.   mod_VypiτHláτku("Optimalizuji vstupní data (t²ídím zboºí sestupn╪ podle hmotnosti)...", mod_VYPIµHL╡µKU_NE¼EKEJ);
  370.   mod_QuickSort_Pole = modStanice_Zboºí;
  371.   mod_QuickSort(0, modStanice_PoƒetZboºí-1, mod_QUICKSORT_DESC);
  372.   mod_QuickSort_Pole = 0;
  373.   }
  374.  
  375. void modStanice_OpakováníInicializace(void) {
  376.   modStanice_Kamion[modStanice_Θroveσ] = (modStanice_Θroveσ==0)?0:(modStanice_Kamion[modStanice_Θroveσ-1]+1);
  377.   }
  378.  
  379. int modStanice_OpakováníTest(void) {
  380.   // kdyº je jeτt╪ jaké zboºí procházet (procházení jeτt╪ nebylo dokonƒeno)
  381.   if(modStanice_Kamion[modStanice_Θroveσ] < modStanice_PoƒetZboºí) {
  382.     // naloºení práv╪ procházeného zboºí do kamionu
  383.     modStanice_NaloºenáHmotnost += modStanice_Zboºí[modStanice_Kamion[modStanice_Θroveσ]];
  384.     }
  385.   // vrácení informace o tom, zda se má pokraƒovat v procházení nebo jiº bylo dokonƒeno
  386.   return modStanice_Kamion[modStanice_Θroveσ] < modStanice_PoƒetZboºí;
  387.   }
  388.  
  389. void modStanice_OpakováníIterace(void) {
  390.   // vyloºení práv╪ doprocházeného zboºí z kamionu
  391.   modStanice_NaloºenáHmotnost -= modStanice_Zboºí[modStanice_Kamion[modStanice_Θroveσ]];
  392.   // p²echod k následujícímu zboºí
  393.   modStanice_Kamion[modStanice_Θroveσ]++;
  394.   }
  395.  
  396. void modStanice_Dalτí¼lánek_P²ed(void) {
  397.   // zv∞τení úrovn╪ backtrackingu (poƒet práv╪ naloºeného zboºí)
  398.   modStanice_Θroveσ++;
  399.   }
  400.  
  401. void modStanice_Dalτí¼lánek_Po(void) {
  402.   // zmenτení úrovn╪ backtrackingu (poƒet práv╪ naloºeného zboºí)
  403.   modStanice_Θroveσ--;
  404.   }
  405.  
  406. int modStanice_TestVyhovuje(void) {
  407.   // zobrazení práv╪ testované pozice, pokud vyhovuje a pokud si uºivatel toto nastavil
  408.   if(modStanice_NaloºenáHmotnost <= modStanice_DostupnáHmotnost) {
  409.     if(mod_ZobrazovanéPozice == mod_VµECHNY_POZICE) {
  410.       int modStanice_ProcházenéZboºí;
  411.       if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  412.         TxtPiτⁿet╪zec(modStanice_PoleZboºíNaⁿet╪zec(modStanice_Kamion, &modStanice_Θroveσ, &modStanice_NaloºenáHmotnost));
  413.         TxtPiτNov∞ⁿádek();
  414.         }
  415.       else if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) {
  416.         modStanice_VykresliZboºí(modStanice_Kamion, modStanice_Θroveσ);
  417.         if(modStanice_PoƒetZboºí <= 9) ¼ekej(1.0/(modStanice_PoƒetZboºí/2.0)*4000-200);
  418.         }
  419.       if(mod_ZapisovatProtokol) {
  420.         for(modStanice_ProcházenéZboºí=0; modStanice_ProcházenéZboºí<=modStanice_Θroveσ; modStanice_ProcházenéZboºí++) SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, StrL¼íslo(modStanice_Zboºí[modStanice_Kamion[modStanice_ProcházenéZboºí]],-1)+" ");
  421.         SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, modStanice_PoleZboºíNaⁿet╪zec(modStanice_Kamion, &modStanice_Θroveσ, &modStanice_NaloºenáHmotnost));
  422.         SouborPiτNov∞ⁿádek(mod_ZapisovatProtokol_Soubor);
  423.         }
  424.       }
  425.    }
  426.   // zjiτt╪ní a vrácení údaje, zda nalezená pozice vyhovuje podmínkám úlohy
  427.   return (modStanice_NaloºenáHmotnost <= modStanice_DostupnáHmotnost);
  428.   }
  429.  
  430. int modStanice_TestNalezeno(void) {
  431.   // nov∞ kandidát na ²eτení byl nalezen, [pokud jiº nelze naloºit ºádné dalτí zboºí nebo pokud jiº po naloºení uvaºovaného zboºí nepàjde naloºit ani poslední ze zboºí (to s nejmenτí hmotností)] a pokud je práv╪ nalezené ²eτení lepτí neº dosud nejlepτí nalezené ²eτení
  432.   return ((modStanice_NaloºenáHmotnost + modStanice_Zboºí[modStanice_PoƒetZboºí-1] > modStanice_DostupnáHmotnost) || (modStanice_Kamion[modStanice_Θroveσ] == modStanice_PoƒetZboºí-1)) && (modStanice_NaloºenáHmotnost > modStanice_Nejlepτíⁿeτení_NaloºenáHmotnost);
  433.  
  434.   /* N╡SLEDUJ╓C╓ VERZE Pⁿ╓KAZU SICE PRODLUªUJE DOBU ⁿEµEN╓, JE VµAK N╡ZORN╖Jµ╓:
  435.   // nov∞ kandidát na ²eτení byl nalezen, pokud jiº nelze naloºit ºádné dalτí zboºí a pokud je práv╪ nalezené ²eτení lepτí neº dosud nejlepτí nalezené ²eτení
  436.   return (modStanice_Kamion[modStanice_Θroveσ] == modStanice_PoƒetZboºí-1) && (modStanice_NaloºenáHmotnost > modStanice_Nejlepτíⁿeτení_NaloºenáHmotnost);
  437.   */
  438.   }
  439.  
  440. void modStanice_Nalezeno(void) {
  441.   // uloºení nalezeného ²eτení jako dosud nejlepτího (platnost faktu, ºe se jedná o ²eτení dosud nejlepτí, zajiτ£uje uº samotná podmínka ve funkci modStanice_TestNalezeno)
  442.   memmove(modStanice_Nejlepτíⁿeτení_Kamion, modStanice_Kamion, modStanice_PoƒetZboºí*sizeof(modStanice_Kamion[0]));
  443.   modStanice_Nejlepτíⁿeτení_Θroveσ = modStanice_Θroveσ;
  444.   modStanice_Nejlepτíⁿeτení_NaloºenáHmotnost = modStanice_NaloºenáHmotnost;
  445.   // zobrazení práv╪ nalezeného ²eτení
  446.   int modStanice_ProcházenéZboºí;
  447.   if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
  448.     TxtPiτⁿet╪zec("Nalezeno dosud nejlepτí ²eτení: ");
  449.     TxtPiτⁿet╪zec(modStanice_PoleZboºíNaⁿet╪zec(modStanice_Nejlepτíⁿeτení_Kamion, &modStanice_Nejlepτíⁿeτení_Θroveσ, &modStanice_Nejlepτíⁿeτení_NaloºenáHmotnost));
  450.     TxtPiτNov∞ⁿádek();
  451.     }
  452.   else if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) {
  453.     mod_VypiτHláτku("Nalezeno dosud nejlepτí ²eτení: " + modStanice_PoleZboºíNaⁿet╪zec(modStanice_Kamion, &modStanice_Θroveσ, &modStanice_NaloºenáHmotnost), mod_VYPIµHL╡µKU_NE¼EKEJ);
  454.     if(mod_ZobrazovanéPozice == mod_POUZE_ⁿEµEN╓) modStanice_VykresliZboºí(modStanice_Kamion, modStanice_Θroveσ);
  455.     }
  456.   // zápis práv╪ nalezeného ²eτení do souboru, pokud si to uºivatel p²ál
  457.   if(mod_ZapisovatProtokol) {
  458.     SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "NALEZENO DOSUD NEJLEPµ╓ ⁿEµEN╓: ");
  459.     SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, modStanice_PoleZboºíNaⁿet╪zec(modStanice_Kamion, &modStanice_Θroveσ, &modStanice_NaloºenáHmotnost));
  460.     SouborPiτNov∞ⁿádek(mod_ZapisovatProtokol_Soubor);
  461.     }
  462.   // v p²ípad╪ grafického reºimu, pokud se ale nezobrazují pouze nalezená ²eτení, pípnutí - oznámení nalezení nového nejlepτího ²eτení
  463.   if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM && !(mod_ZobrazovanéPozice == mod_POUZE_ⁿEµEN╓)) { Tón(1000); ¼ekej(100); VypniTón(); }
  464.   // vyƒkání na stisk klávesy, pokud si to uºivatel p²ál
  465.   if(mod_¼ekatNaKlávesu) ¼ekejNaKlávesu();
  466.   }
  467.  
  468. void modStanice_InfoOModulu(struct _ModulInfo* ModulInfo) {
  469.   ModulInfo->KrátkéJméno = "STANICE";
  470.   ModulInfo->DlouhéJméno = "Vyt╪ºovací stanice";
  471.   ModulInfo->Popis = "S problémem ²eτen∞m tímto modulem se denn╪ setkávají zam╪stnanci tzv. vyt╪ºovacích stanic. Vyt╪ºovací stanice jsou místa, kam p²ijíºd╪jí ²idiƒi kamionà p²ed tím, neº vyrazí na cestu. V╪tτinou totiº jeτt╪ mají ve svém kamionu n╪jaké volné místo a rádi by jej vyuºili, protoºe vzít n╪jak∞ náklad navíc jim neƒinní velké problémy. Vyt╪ºovací stanice získává od firem bez kamionà zboºí, které pot²ebují n╪kam doruƒit, a následn╪ jím vyt╪ºuje pln╪ neobsazené kamiony, které pak za p²evoz tohoto cizího zboºí dostanou zaplaceno. ⁿeτen∞ problém spoƒívá v tom, ºe vzhledem k ràzn∞m hmotnostem zboºí, které je k dispozici, je t²eba jej navybírat tak, aby vybrané zboºí kamion nep²etíºilo, ale zase aby v n╪m zbylo pokud moºno co nejmén╪ nevyuºité hmotnosti.";
  472.   ModulInfo->Verze = 1.0;
  473.   ModulInfo->Datum.Den = 11;
  474.   ModulInfo->Datum.M╪síc = 9;
  475.   ModulInfo->Datum.Rok = 2002;
  476.   ModulInfo->Autor = "Marek Blahuτ";
  477.   ModulInfo->Kontakt = "blahus@seznam.cz";
  478.   ModulInfo->Start = &modStanice_Start;
  479.   ModulInfo->Hotovo = &modStanice_Hotovo;
  480.   ModulInfo->Θklid = &modStanice_Θklid;
  481.   ModulInfo->ZadáníVstupu = &modStanice_ZadáníVstupu;
  482.   ModulInfo->OptimalizaceVstupu = &modStanice_OptimalizaceVstupu;
  483.   ModulInfo->OpakováníInicializace = &modStanice_OpakováníInicializace;
  484.   ModulInfo->OpakováníTest = &modStanice_OpakováníTest;
  485.   ModulInfo->OpakováníIterace = &modStanice_OpakováníIterace;
  486.   ModulInfo->Dalτí¼lánek_P²ed = &modStanice_Dalτí¼lánek_P²ed;
  487.   ModulInfo->Dalτí¼lánek_Po = &modStanice_Dalτí¼lánek_Po;
  488.   ModulInfo->TestVyhovuje = &modStanice_TestVyhovuje;
  489.   ModulInfo->TestNalezeno = &modStanice_TestNalezeno;
  490.   ModulInfo->Nalezeno = &modStanice_Nalezeno;
  491.   }
  492.