Advertisement
Guest User

Untitled

a guest
Apr 21st, 2015
229
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.69 KB | None | 0 0
  1. #include <fstream>
  2. #include <queue>
  3. #include <map>
  4. #include <cstdio>
  5. using namespace std;
  6.  
  7. struct stair {
  8.     int bf, bl, tf, il, p, ct;
  9. };
  10.  
  11. int mn (int x, int y) {
  12.     if (x < y) return x;
  13.     return y;
  14. }
  15.  
  16. int findtimeb (int il, int p, int mntime, int dl) {
  17.     int cl = (il + mntime/p)%3;
  18.     if (cl == dl) return mntime;
  19.     mntime = (mntime/p)*p + p;
  20.     cl = (cl+1)%3;
  21.     if (cl == dl) return mntime;
  22.     return mntime + p;
  23. }
  24.  
  25. int findtimet (int il, int p, int mntime, int ml, int ct) {
  26.     int cl = (il + (mntime+ct)/p)%3;
  27.     if (cl == ml) return mntime+ct;
  28.     mntime = (mntime/p)*p + p;
  29.     cl = (cl+1)%3;
  30.     if (cl == ml) return mntime+ct;
  31.     return mntime + p + ct;
  32. }
  33.  
  34. int geton (int il, int p, int time, int ml) {
  35.     int cl = (il + time/p)%3;
  36.     if (cl == ml) return time;
  37.     time = (time/p)*p + p;
  38.     cl = (cl+1)%3;
  39.     if (cl == ml) return time;
  40.     return time + p;
  41. }
  42.  
  43. int main () {
  44.     map<string, int> landing;
  45.     landing["L"] = 0;
  46.     landing["C"] = 1;
  47.     landing["R"] = 2;
  48.     stair stairs[2000];
  49.     int goalf, goall, totst, a, b, c, closest;
  50.     string in1, in2;
  51.     ifstream infil ("stairin.txt");
  52.     infil >> goalf >> in1 >> totst;
  53.     if (goalf == 0) goall = 0;
  54.     else goall = landing[in1];
  55.     for (int i=0; i<totst; i++) {
  56.         infil >> a >> in1 >> b >> in2 >> c;
  57.         if (a == 0) stairs[i] = (stair){a,0,b,landing[in2],c,(b-a)*5};
  58.         else stairs[i] = (stair){a,landing[in1],b,landing[in2],c,(b-a)*5};
  59.     }
  60.     bool seen[1203];
  61.     int dist[1203];
  62.     for (int i=0; i<1203; i++) {
  63.         seen[i] = false;
  64.         dist[i] = 1000000000;
  65.     }
  66.     dist[0] = 0;
  67.     while (true) {
  68.         closest = -1;
  69.         for (int i=0; i<1203; i++) {
  70.             if (!seen[i] && (closest == -1 || dist[i]<dist[closest])) closest = i;
  71.         }
  72.         if (closest == -1) break;
  73.         seen[closest] = true;
  74.         for (int i=0; i<totst; i++) {
  75.             if (stairs[i].bf == closest/3 && stairs[i].bl == closest%3) {
  76.                 dist[stairs[i].tf*3] = mn(findtimeb(stairs[i].il, stairs[i].p, dist[closest]+stairs[i].ct, 0),dist[stairs[i].tf*3]);
  77.                 dist[stairs[i].tf*3+1] = mn(findtimeb(stairs[i].il, stairs[i].p, dist[closest]+stairs[i].ct, 1),dist[stairs[i].tf*3+1]);
  78.                 dist[stairs[i].tf*3+2] = mn(findtimeb(stairs[i].il, stairs[i].p, dist[closest]+stairs[i].ct, 2),dist[stairs[i].tf*3+2]);
  79. //                printf("Found bottom of stair: %d: %d, %d:%d, %d:%d\n", stairs[i].tf*3, dist[stairs[i].tf*3], stairs[i].tf*3+1, dist[stairs[i].tf*3+1], stairs[i].tf*3+2, dist[stairs[i].tf*3+2]);
  80.             } if (stairs[i].tf == closest/3) {
  81.                 dist[stairs[i].bf*3+stairs[i].bl] = mn(findtimet(stairs[i].il, stairs[i].p, geton(stairs[i].il, stairs[i].p, dist[closest], closest%3), closest/3, stairs[i].ct), dist[stairs[i].bf*3+stairs[i].bl]);
  82.                 dist[stairs[i].tf*3] = mn(findtimeb(stairs[i].il, stairs[i].p, geton(stairs[i].il, stairs[i].p, dist[closest], closest%3), 0),dist[stairs[i].tf*3]);
  83.                 dist[stairs[i].tf*3+1] = mn(findtimeb(stairs[i].il, stairs[i].p, geton(stairs[i].il, stairs[i].p, dist[closest], closest%3), 1),dist[stairs[i].tf*3+1]);
  84.                 dist[stairs[i].tf*3+2] = mn(findtimeb(stairs[i].il, stairs[i].p, geton(stairs[i].il, stairs[i].p, dist[closest], closest%3), 2),dist[stairs[i].tf*3+2]);
  85. //                printf("Found top of stair: %d: %d\n", stairs[i].bf*3+stairs[i].bl, dist[stairs[i].bf*3+stairs[i].bl]);
  86.             }
  87.         }
  88.     }
  89. //    for (int i=1199; i>=0; i--) {
  90. //        printf("%d   ", dist[i]);
  91. //        if (i%3 == 0) printf("\n");
  92. //    }
  93.     ofstream outfil ("stairout.txt");
  94.     outfil << dist[goalf*3+goall];
  95.     return 0;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement