Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- #include <queue>
- #include <map>
- #include <cstdio>
- using namespace std;
- struct stair {
- int bf, bl, tf, il, p, ct;
- };
- int mn (int x, int y) {
- if (x < y) return x;
- return y;
- }
- int findtimeb (int il, int p, int mntime, int dl) {
- int cl = (il + mntime/p)%3;
- if (cl == dl) return mntime;
- mntime = (mntime/p)*p + p;
- cl = (cl+1)%3;
- if (cl == dl) return mntime;
- return mntime + p;
- }
- int findtimet (int il, int p, int mntime, int ml, int ct) {
- int cl = (il + (mntime+ct)/p)%3;
- if (cl == ml) return mntime+ct;
- mntime = (mntime/p)*p + p;
- cl = (cl+1)%3;
- if (cl == ml) return mntime+ct;
- return mntime + p + ct;
- }
- int geton (int il, int p, int time, int ml) {
- int cl = (il + time/p)%3;
- if (cl == ml) return time;
- time = (time/p)*p + p;
- cl = (cl+1)%3;
- if (cl == ml) return time;
- return time + p;
- }
- int main () {
- map<string, int> landing;
- landing["L"] = 0;
- landing["C"] = 1;
- landing["R"] = 2;
- stair stairs[2000];
- int goalf, goall, totst, a, b, c, closest;
- string in1, in2;
- ifstream infil ("stairin.txt");
- infil >> goalf >> in1 >> totst;
- if (goalf == 0) goall = 0;
- else goall = landing[in1];
- for (int i=0; i<totst; i++) {
- infil >> a >> in1 >> b >> in2 >> c;
- if (a == 0) stairs[i] = (stair){a,0,b,landing[in2],c,(b-a)*5};
- else stairs[i] = (stair){a,landing[in1],b,landing[in2],c,(b-a)*5};
- }
- bool seen[1203];
- int dist[1203];
- for (int i=0; i<1203; i++) {
- seen[i] = false;
- dist[i] = 1000000000;
- }
- dist[0] = 0;
- while (true) {
- closest = -1;
- for (int i=0; i<1203; i++) {
- if (!seen[i] && (closest == -1 || dist[i]<dist[closest])) closest = i;
- }
- if (closest == -1) break;
- seen[closest] = true;
- for (int i=0; i<totst; i++) {
- if (stairs[i].bf == closest/3 && stairs[i].bl == closest%3) {
- dist[stairs[i].tf*3] = mn(findtimeb(stairs[i].il, stairs[i].p, dist[closest]+stairs[i].ct, 0),dist[stairs[i].tf*3]);
- 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]);
- 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]);
- // 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]);
- } if (stairs[i].tf == closest/3) {
- 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]);
- 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]);
- 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]);
- 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]);
- // printf("Found top of stair: %d: %d\n", stairs[i].bf*3+stairs[i].bl, dist[stairs[i].bf*3+stairs[i].bl]);
- }
- }
- }
- // for (int i=1199; i>=0; i--) {
- // printf("%d ", dist[i]);
- // if (i%3 == 0) printf("\n");
- // }
- ofstream outfil ("stairout.txt");
- outfil << dist[goalf*3+goall];
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement