function celkova_doba(stavebni_rada, delka_polozky)
  {
   var suroviny = [500, 500, 0];
   var doly = [0, 0, 0];
   
   var doba = 0;
  
   var budova;
   var lvl;
  
   var cena_surr = [0, 0, 0];
   var cekani = [0, 0, 0];
   
   for(i=0; i<stavebni_rada.length ; i+=delka_polozky+1)
     {
      cekani = [0, 0, 0];
      
      budova = stavebni_rada[i];
//console.log("BUDOVA:   "+budova);
      if(budova=="K")      budova = "kov";
      else if(budova=="C") budova = "krystal";
      //else if(budova=="D") budova = "deuterium";
      else if(budova=="S") budova = "solar";   
      lvl = extract_number(stavebni_rada.substring(i, i+delka_polozky));
      
      cena_surr[0] = cena(budova, lvl, "kov");
      cena_surr[1] = cena(budova, lvl, "krystal");
      //cena_surr[2] = cena(budova, lvl, "deuterium");
      
//console.log("CENA:     "+cena_surr);
//console.log("SURR_mame:"+suroviny);
      if(cena_surr[0] > suroviny[0]){ cekani[0] = ((cena_surr[0]-suroviny[0]) /   (produkce("kov", doly[0], 1)     ) *3600) |0; }
      if(cena_surr[1] > suroviny[1]){ cekani[1] = ((cena_surr[1]-suroviny[1]) /   (produkce("krystal", doly[1], 1)) *3600) |0; }  
      //if(cena_surr[2] > suroviny[2]){ cekani[2] = (cena_surr[2]-suroviny[2]) / (produkce("deuterium", doly[2], 1)); }   

//console.log("CEKANI:   "+cekani);

      cekani = cekani.sort(function(a, b){return a-b});
      cekani[2] += doba_stavby(budova, lvl, 0, 0); 
//console.log("CEKANI_2: "+cekani[2]);
      suroviny[0] += ((((cekani[2]/3600) * produkce("kov", doly[0], 1)) |0) ) - cena_surr[0];
      suroviny[1] += ((((cekani[2]/3600) * produkce("krystal", doly[1], 1)) |0) ) - cena_surr[1];
      //suroviny[2] += (cekani[2] * produkce("deuterium", doly[2], 1)) - cena_surr[2];
      doba += cekani[2];
//console.log("SURR:     "+suroviny);      
//console.log("Cekani:   "+cekani);
//console.log(" ");      
      if(budova=="kov")            doly[0]++;
      else if(budova=="kov")       doly[1]++;
      //else if(budova=="deuterium") doly[2]++;

     }
   return doba; 
  }
// --------------------------------------------------------------------------------------------------------------------------------------------------------
function produkce(budova, lvl, rychlost)   // kov + krystal = celková produkce
  {
   
   if(budova == "kov" && lvl>0){ return ((30*lvl*Math.pow(1.1,lvl)*rychlost)+30) | 0 ; }
   else if(budova == "kov" && lvl==0){ return 30; }
   else if(budova == "krystal" && lvl>0){ return ((20*lvl*Math.pow(1.1,lvl)*rychlost)+15) | 0 ; }  
   else if(budova == "krystal" && lvl==0){ return 15; }
   // deu   
   else {console.log("Chyba ve fci produkce"); return 0};
  }
  
function spotreba(budova, lvl)
  {
   if(lvl==0){ return 0;}
   
   var solar = [0, -22, -26, -31, -38, -43, -51, -60, -70, -82, -94, -109, -126, -144, -166, -190, -217, -248, -283, -323, -366, -418, -473, -537, -609, -690, -780, -882, -996, -1125, -1269, -1431, -1612, -1816, -2044, -2299, -2586];
   var kov_krystal = [0, 11, 14, 15, 19, 22, 26, 30, 35, 41, 47, 54, 63, 72, 83, 95, 109, 124, 141, 162, 183, 209, 236, 269, 304, 345, 390, 441, 498, 563, 634, 716, 806, 908, 1022, 1149, 1293, 1453, 1632, 1833, 2057, 2308, 2589, 2903, 3253, 3644, 4082, 4570, 5166, 5724, 6403];
   var deuterium = [0, 22, 27, 31, 38, 44, 51, 60, 70, 82, 94];

   if(budova == "solar") return solar[lvl];
   else if(budova == "kov" || budova == "krystal") return kov_krystal[lvl];
   else if(budova == "deuterium") return deuterium[lvl];
   else {console.log("Chyba ve fci spotreba()"); return 0};
  }                                                         

function cena(budova, lvl, surovina)
  {  
   //console.log("CENA-BUDOVA:"+budova+";"+lvl+";"+surovina);
   if(lvl==0){ return 0;}
   else if(surovina=="kov")
     {
      if(budova == "kov"){ return 60*Math.pow(1.5, lvl-1) | 0; }
      else if(budova == "krystal"){ return 48*Math.pow(1.6, lvl-1) | 0; }
      else if(budova == "deuterium"){ return 225*Math.pow(1.5, lvl-1) | 0; } 
      else if(budova == "solar"){ return 75*Math.pow(1.5, lvl-1) | 0; }      
     }
   else if(surovina=="krystal")
     {
      if(budova == "kov"){ return 15*Math.pow(1.5, lvl-1) | 0; }
      else if(budova == "krystal"){ return 24*Math.pow(1.6, lvl-1) | 0; }
      else if(budova == "deuterium"){ return 75*Math.pow(1.5, lvl-1) | 0; } 
      else if(budova == "solar"){ return 30*Math.pow(1.5, lvl-1) | 0; }      
     }
   else if(surovina=="deuterium")
     {
      if(budova == "kov"){ return 0; }
      else if(budova == "krystal"){ return 0; }
      else if(budova == "deuterium"){ return 0; } 
      else if(budova == "solar"){ return 0; }      
     }
   else {console.log("Chyba ve fci cena"); return 0};    
  }  


function doba_stavby(budova, lvl, robo, nano)
  {
   if(lvl==0){ return 0;}
   return (((cena(budova, lvl, "kov") + cena(budova, lvl, "krystal")) / (2500*(robo+1)*Math.pow(0.5,nano)) ) *3600 ) | 0;
  }
// --------------------------------------------------------------------------------------------------------------------------------------------------------
function extract_number(data)
  {
   var i=0;  var y="";
   while( i < data.length )
     {                       
      if( data[i]==="0" || data[i]==="1" || data[i]==="2" || data[i]==="3" || data[i]==="4" || data[i]==="5" || data[i]==="6" || data[i]==="7" || data[i]==="8" || data[i]==="9" ) { y += data[i]; }
      i++;
     }
   return parseInt(y);  
  }
// --------------------------------------------------------------------------------------------------------------------------------------------------------  
function test_duplicity(pole)
  {
   for (var i=0; i < pole.length-1; i++) { if(pole[i+1] == pole[i]) { return -1; } }
  }
// --------------------------------------------------------------------------------------------------------------------------------------------------------
function test_predchudcu(pole)
  {
   pole.forEach( function(polozka, index)
                   {
                    var lvl = extract_number(polozka);
                    for(i=1; i<lvl; i++)
                      {
                       if(i<10){ if( pole.indexOf(polozka[0]+i+" ") == -1 || pole.indexOf(polozka[0]+i+" ") > index){ pole[0] = -1;} }
                       else { if( pole.indexOf(polozka[0]+i+"") == -1 || pole.indexOf(polozka[0]+i+"") > index){ pole[0]  = -1;} }                        
                      }
                   }
               )
   if( pole[0]  == -1 ) return -1;
   else return 0;
  }
// --------------------------------------------------------------------------------------------------------------------------------------------------------
function test_energie(pole)
  {
   var spotreba_en = 0;
   
   for(i=0; i<pole.length-1; i++)
     {
      var budova = pole[i][0];
      
//      console.log(budova);
      
      if(budova=="K")      budova = "kov";
      else if(budova=="C") budova = "krystal";
      else if(budova=="D") budova = "deuterium";
      else if(budova=="S") budova = "solar";   
      
      var lvl = extract_number(pole[i]);
      
//      console.log(lvl);
      
      spotreba_en += spotreba(budova, lvl);
      
//      console.log(spotreba_en);
      
      if(spotreba_en > 0) return -1;
     }
   return 0;
  }
// --------------------------------------------------------------------------------------------------------------------------------------------------------

function generuj(chars, suroviny, doly, energie) 
  {    
   var pocet_polozek = chars.length;
   var delka_polozky = chars[0].length;

   var pole = JSON.parse(JSON.stringify(chars));
       pole.forEach(function(i, index){ pole[index] = 0; })
   var stavby = JSON.parse(JSON.stringify(chars));
       stavby.forEach(function(i, index){ stavby[index] = 0; })
       
   var duplicita = 0;
   var predchudci = 0;
   var energie = 0;
   var iterace = 0;
   var pocet_it = 0;
   
   while( pole[0] != pocet_polozek)
     {
      
      if(iterace == 1000000)
        {
         pocet_it++;
         iterace=0;
         console.log("It: "+pocet_it+".000.000  | Dup:"+duplicita+"  | Pred:"+predchudci+"  | En:"+energie);
        }
      
      if( test_duplicity(pole.slice().sort()) != -1)
        {
         for(y=0 ; y<pocet_polozek ; y++){ stavby[y] = chars[pole[y]]; }  
         //console.log(stavby);
         if( test_predchudcu(stavby) != -1 )
           {
            if( test_energie(stavby) != -1 )
             {
     
              console.log(stavby+"\t"+celkova_doba(stavby.toString(), delka_polozky)+"\t\t It:"+((pocet_it*1000000)+iterace)+"  | Dup:"+duplicita+"  | Pred:"+predchudci+"  | En:"+energie);

             }
          else{ energie++;}
           }
        else{ predchudci++;}
        }
      else{ duplicita++;}
      iterace++;
      
      for(i=pocet_polozek-1; i>=0; i--)
        {
         if(i==0 && pole[i] < pocet_polozek){pole[i]++; break;}
         if(pole[i] < pocet_polozek-1){pole[i]++; break;}
         else pole[i]=0;
        }  
     }                 
  }                         

//localStorage.setItem("SHEDULE_TIME", 999999999999999999999);

//var chars = ["S1 ", "S2 ", "S3 ", "S4 ", "S5 ", "S6 ", "S7 ", "S8 ", "S9 ", "K1 ", "K2 ", "K3 ", "K4 ", "K5 ", "K6 ", "K7 ", "K8 ", "K9 ", "K10", "C1 ", "C2 ", "C3 ", "C4 ", "C5 ", "C6 ", "C7 "];
var chars = ["S1 ", "K1 ", "K2 ", "C1 ", "S2 ", "S3 ", "S4 ", "K3 ", "K4 "];
console.log("START");
generuj(chars, [500, 500, 0], [0, 0, 0], 0);
console.log("KONEC");

//--------------------------------------------------------

function solve(a, b, c, a_max, b_max, c_max, solution)
{
 if( a==a_max && b==b_max && c==c_max )
   {
    console.log(solution);
    //if( test_energie(stavby) != -1 )
    //  {
    //   console.log(stavby+"\t"+celkova_doba(stavby.toString(), delka_polozky)+"\t\t It:"+((pocet_it*1000000)+iterace)+"  | Dup:"+duplicita+"  | Pred:"+predchudci+"  | En:"+energie);
    //  }
   }
 if( a<a_max )
   {
    a++;
    solution = solution+"K"+a+" ";
    solve(a, b, c, a_max, b_max, c_max, solution);
    a--;
    solution = solution.substring(0, solution.length - 3);
   }
 if( b<b_max )
   {
    b++;
    solution = solution+"C"+b+" ";
    solve(a, b, c, a_max, b_max, c_max, solution);
    b--;
    solution = solution.substring(0, solution.length - 3);
   }
 if( c<c_max )
   {
    c++;
    solution = solution+"S"+c+" ";
    solve(a, b, c, a_max, b_max, c_max, solution);
    c--;
    solution = solution.substring(0, solution.length - 3);
   }
}

solve(0, 0, 0, 4, 2, 4, "");