Advertisement
Malinovsky239

Untitled

May 9th, 2011
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.23 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <vector>
  4. #include <cassert>
  5.  
  6. #define N 55
  7. #define pb push_back
  8. #define INF int(1e9)
  9.  
  10. using namespace std;
  11.  
  12. char type[30];
  13. int lab[N][N];
  14.  
  15. struct two
  16. {
  17.     int x, y;
  18.  
  19.     two() {}
  20.  
  21.     two(int a, int b)
  22.     {
  23.         x = a, y = b;
  24.     }
  25. };
  26.  
  27. two hole[N][N];
  28. int x_hole[N * N], y_hole[N * N];
  29. bool wall[N][N][4];
  30.  
  31. vector<int> w[N][N];
  32. vector<two> graph[N][N];
  33.  
  34. two from[N][N];
  35. int dist[N][N];
  36. bool used[N][N], out[N][N], ref[N][N];
  37.  
  38. void answer(int x, int y)
  39. {
  40.     if (from[x][y].x)
  41.         answer(from[x][y].x, from[x][y].y);
  42.     if (from[x][y].x != x || from[x][y].y != y) printf("%d %d\n",x, y);
  43. }
  44.  
  45. int main()
  46. {
  47.     freopen("princess.in", "r", stdin);
  48.     freopen("princess.out", "w", stdout);
  49.  
  50.     int n, m, k;
  51.     scanf("%d %d %d ", &m, &n, &k);
  52.  
  53.     for (int i = 0; i < k; i++)
  54.     {
  55.         int x, y;
  56.         scanf("%d %d %*c ", &x, &y);
  57.         out[x][y] = true;
  58.     }
  59.  
  60.     int z;
  61.     scanf("%d ", &z);
  62.  
  63.     for (int i = 0; i < z; i++)
  64.     {
  65.         int x, y;
  66.  
  67.         scanf("%d %d %s", &x, &y, type);
  68.  
  69.         switch (type[0])
  70.         {
  71.             case 'P': lab[x][y] += 2; break;
  72.             case 'M': lab[x][y] += 4; break;
  73.             case 'A': lab[x][y] += 6; break;
  74.             case 'B':
  75.             {
  76.                 if (type[1] == 'A')
  77.                     lab[x][y] += 8;
  78.                 else
  79.                     lab[x][y] += 10;                   
  80.                
  81.                 break;
  82.             }
  83.         }
  84.     }
  85.  
  86.     int W;
  87.     scanf("%d ", &W);
  88.     for (int i = 0; i < W; i++)
  89.     {
  90.         int x, y;
  91.         char side;
  92.         scanf("%d %d %c ", &x, &y, &side);
  93.  
  94.         switch (side)
  95.         {
  96.             case 'L': wall[x][y][0] = wall[x - 1][y][1] = true; break;
  97.             case 'R': wall[x][y][1] = wall[x + 1][y][0] = true; break;
  98.             case 'U': wall[x][y][2] = wall[x][y - 1][3] = true; break;
  99.             case 'D': wall[x][y][3] = wall[x][y + 1][2] = true; break;
  100.         }
  101.     }
  102.  
  103.     int l;
  104.     scanf("%d ", &l);
  105.  
  106.     for (int i = 0; i < l; i++)
  107.     {
  108.         int p;
  109.         scanf("%d ", &p);
  110.         /*if (p == 1)
  111.         {
  112.             int x, y;
  113.             scanf("%d %d ", &x, &y);
  114.             ref[x][y] = true;
  115.             continue;
  116.         }*/
  117.  
  118.         for (int j = 0; j < p; j++)
  119.         {
  120.             scanf("%d %d ", x_hole + j, y_hole + j);
  121.  
  122.             if (j)
  123.                 hole[ x_hole[j-1] ][ y_hole[j-1] ] = two( x_hole[j], y_hole[j] );
  124.            
  125.             if (j == p - 1)
  126.                 hole[ x_hole[j] ][ y_hole[j] ] = two( x_hole[0], y_hole[0] );
  127.         }
  128.     }
  129.  
  130.     for (int i = 1; i <= m; i++)
  131.         for (int j = 1; j <= n; j++)
  132.         {
  133.             if (hole[i][j].x)
  134.             {
  135.                 graph[i][j].pb( hole[i][j] );
  136.  
  137. //              printf("(%d, %d) -> (%d, %d)\n", i, j, hole[i][j].x, hole[i][j].y);
  138.  
  139.                 w[i][j].pb(0);
  140.             }
  141.  
  142.  
  143.             if (!wall[i][j][0] && i - 1) // to the left
  144.             {
  145.                 if (hole[i - 1][j].x)
  146.                 {
  147.                     graph[i][j].pb( hole[i - 1][j] );
  148.  
  149. //                  printf("(%d, %d) -> (%d, %d)\n", i, j, hole[i - 1][j].x, hole[i - 1][j].y);
  150.  
  151.                     w[i][j].pb(0);             
  152.                 }
  153.                 else
  154.                 {
  155.                     graph[i][j].pb( two(i - 1, j) );
  156.  
  157. //                  printf("(%d, %d) -> (%d, %d)\n", i, j, i - 1, j);
  158.  
  159.                     w[i][j].pb(lab[i - 1][j]);
  160.                 }
  161.             }
  162.  
  163.  
  164.             if (!wall[i][j][1] && i + 1 <= m) // to the right
  165.             {
  166.                 if (hole[i + 1][j].x)
  167.                 {
  168.                     graph[i][j].pb( hole[i + 1][j] );
  169.  
  170. //                  printf("(%d, %d) -> (%d, %d)\n", i, j, hole[i + 1][j].x, hole[i + 1][j].y);
  171.  
  172.                     w[i][j].pb(0);             
  173.                 }
  174.                 else
  175.                 {
  176.                     graph[i][j].pb( two(i + 1, j) );
  177.  
  178. //                  printf("(%d, %d) -> (%d, %d)\n", i, j, i + 1, j);
  179.  
  180.                     w[i][j].pb(lab[i + 1][j]);
  181.                 }
  182.             }
  183.  
  184.  
  185.             if (!wall[i][j][2] && j - 1) // up
  186.             {
  187.                 if (hole[i][j - 1].x)
  188.                 {
  189.                     graph[i][j].pb( hole[i][j - 1] );
  190.  
  191. //                  printf("(%d, %d) -> (%d, %d)\n", i, j, hole[i][j - 1].x, hole[i][j - 1].y);
  192.  
  193.                     w[i][j].pb(0);             
  194.                 }
  195.                 else
  196.                 {
  197.                     graph[i][j].pb( two(i, j - 1) );
  198.  
  199. //                  printf("(%d, %d) -> (%d, %d)\n", i, j, i, j - 1);
  200.  
  201.                     w[i][j].pb(lab[i][j - 1]);
  202.                 }
  203.             }
  204.  
  205.  
  206.             if (!wall[i][j][3] && j + 1 <= n) // down
  207.             {
  208.                 if (hole[i][j + 1].x)
  209.                 {
  210.                     graph[i][j].pb( hole[i][j + 1] );
  211.  
  212. //                  printf("(%d, %d) -> (%d, %d)\n", i, j, hole[i][j + 1].x, hole[i][j + 1].y);
  213.  
  214.                     w[i][j].pb(0);             
  215.                 }
  216.                 else
  217.                 {
  218.                     graph[i][j].pb( two(i, j + 1) );
  219.  
  220. //                  printf("(%d, %d) -> (%d, %d)\n", i, j, i, j + 1);
  221.  
  222.                     w[i][j].pb(lab[i][j + 1]);
  223.                 }
  224.             }
  225.         }
  226.  
  227.     int x_start, y_start;
  228.     scanf("%d %d %*d %*d ", &x_start, &y_start);
  229.  
  230.     for (int i = 0; i < N; i++)
  231.         for (int j = 0; j < N; j++)
  232.             dist[i][j] = INF;
  233.    
  234.     dist[x_start][y_start] = lab[x_start][y_start];
  235.  
  236.     for (int iter = 0; iter < n * m; iter++)
  237.     {
  238.         int ind_x = 0, ind_y = 0, val = INF + 1;
  239.  
  240.         for (int x = 1; x <= m; x++)
  241.             for (int y = 1; y <= n; y++)
  242.             {
  243.                 if (!used[x][y] && dist[x][y] < val)
  244.                 {
  245.                     val = dist[x][y];
  246.                     ind_x = x, ind_y = y;
  247.                 }
  248.             }      
  249.  
  250.         used[ind_x][ind_y] = true;
  251.         for (int i = 0; i < graph[ind_x][ind_y].size(); i++)
  252.         {
  253.             two u = graph[ind_x][ind_y][i];
  254.             if ( dist[u.x][u.y] > dist[ind_x][ind_y] + w[ind_x][ind_y][i])
  255.             {
  256.                 dist[u.x][u.y] = dist[ind_x][ind_y] + w[ind_x][ind_y][i];
  257.                 from[u.x][u.y] = two(ind_x, ind_y);
  258.             }
  259.         }
  260.     }
  261.  
  262.     int res = INF, x_finish, y_finish;
  263.  
  264.     for (int x = 1; x <= m; x++)
  265.         for (int y = 1; y <= n; y++)
  266.             if (out[x][y] && !ref[x][y])
  267.             {
  268.                 if (dist[x][y] < res)
  269.                 {
  270.                     res = dist[x][y];
  271.                     x_finish = x;
  272.                     y_finish = y;
  273.                 }
  274.             }
  275.  
  276.     if (res == INF)
  277.     {
  278.         cout << -1;
  279.         return 0;
  280.     }
  281.  
  282.     printf("%d\n", res);
  283.     answer(x_finish, y_finish);
  284.    
  285.     return 0;
  286. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement