Guest User

Untitled

a guest
Jan 4th, 2017
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.41 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <cmath>
  5. #include <set>
  6.  
  7. using namespace std ;
  8.  
  9.  
  10. const int maxSide = 1100 ;
  11. const int INF = 100000000 ;
  12.  
  13. vector< vector<string> > color(maxSide, vector<string>(maxSide, "xxxx")) ;
  14. vector< vector<int> > dist(maxSide, vector<int>(maxSide, INF)) ;
  15. vector< vector<bool> > visit(maxSide, vector<bool>(maxSide, false)) ;
  16. int M, N ;
  17.  
  18. int main()
  19. {
  20.     ios::sync_with_stdio(false) ;
  21.     cin.tie(0) ;
  22.  
  23.  
  24.     string cur ;
  25.     cin >> M >> N ;
  26.     char ch1, ch2, ch3, ch4 ;
  27.     for(int i = 1 ; i <= M ; i++)
  28.     {
  29.         for(int j = 1 ; j <= N ; j++)
  30.         {
  31.  
  32.             cin >> ch1 >> ch2 >> ch3 >> ch4 ;
  33.             color[i][j][0] = ch1 ;
  34.             color[i][j][1] = ch2 ;
  35.             color[i][j][2] = ch3 ;
  36.             color[i][j][3] = ch4 ;
  37.  
  38.             //cout << color[i][j] << "\n" ;
  39.         }
  40.     }
  41.  
  42.     dist[1][1] = 0 ;
  43.  
  44.     pair<int, pair<int, int> > tmp ;
  45.     tmp.first = 0, tmp.second.first = 1, tmp.second.second = 1 ;
  46.     set< pair<int, pair<int, int> > > Q ;
  47.     Q.insert(tmp) ;
  48.  
  49.     while(true)
  50.     {
  51.         tmp = *(Q.begin()) ;
  52.  
  53.         Q.erase(Q.begin()) ;
  54.  
  55.         int min_dist = tmp.first ;
  56.         int cur_r = tmp.second.first ;
  57.         int cur_c = tmp.second.second ;
  58.  
  59.         if(cur_r == M && cur_c == N)
  60.             break ;
  61.  
  62.         if(visit[cur_r][cur_c])
  63.             continue ;
  64.  
  65.         visit[cur_r][cur_c] = true ;
  66.  
  67.         char next_col ;
  68.         int cur_pen = 0 ;
  69.  
  70.         // Right
  71.         if(cur_c + 1 <= N)
  72.         {
  73.             next_col = color[cur_r][cur_c+1][3] ;
  74.  
  75.             if(color[cur_r][cur_c][0] == next_col) cur_pen = 1 ;
  76.             else if(color[cur_r][cur_c][1] == next_col) cur_pen = 0 ;
  77.             else if(color[cur_r][cur_c][2] == next_col) cur_pen = 3 ;
  78.             else cur_pen = 2 ;
  79.  
  80.             if(min_dist + cur_pen < dist[cur_r][cur_c+1])
  81.             {
  82.                 dist[cur_r][cur_c+1] = min_dist + cur_pen ;
  83.                 tmp.first = min_dist + cur_pen ;
  84.                 tmp.second.first = cur_r ;
  85.                 tmp.second.second = cur_c+1 ;
  86.                 Q.insert(tmp) ;
  87.             }
  88.         }
  89.  
  90.         // Left
  91.         if(cur_c - 1 > 0)
  92.         {
  93.             next_col = color[cur_r][cur_c-1][1] ;
  94.  
  95.             if(color[cur_r][cur_c][0] == next_col) cur_pen = 3 ;
  96.             else if(color[cur_r][cur_c][1] == next_col) cur_pen = 2 ;
  97.             else if(color[cur_r][cur_c][2] == next_col) cur_pen = 1 ;
  98.             else cur_pen = 0 ;
  99.  
  100.             if(min_dist + cur_pen < dist[cur_r][cur_c-1])
  101.             {
  102.                 dist[cur_r][cur_c-1] = min_dist + cur_pen ;
  103.                 tmp.first = min_dist + cur_pen ;
  104.                 tmp.second.first = cur_r ;
  105.                 tmp.second.second = cur_c-1 ;
  106.                 Q.insert(tmp) ;
  107.             }
  108.         }
  109.  
  110.         // Down
  111.         if(cur_r + 1 <= M)
  112.         {
  113.             next_col = color[cur_r+1][cur_c][0] ;
  114.  
  115.             if(color[cur_r][cur_c][0] == next_col) cur_pen = 2 ;
  116.             else if(color[cur_r][cur_c][1] == next_col) cur_pen = 1 ;
  117.             else if(color[cur_r][cur_c][2] == next_col) cur_pen = 0 ;
  118.             else cur_pen = 3 ;
  119.  
  120.             if(min_dist + cur_pen < dist[cur_r+1][cur_c])
  121.             {
  122.                 dist[cur_r+1][cur_c] = min_dist + cur_pen ;
  123.                 tmp.first = min_dist + cur_pen ;
  124.                 tmp.second.first = cur_r+1 ;
  125.                 tmp.second.second = cur_c ;
  126.                 Q.insert(tmp) ;
  127.             }
  128.         }
  129.  
  130.         // Up
  131.         if(cur_r - 1 > 0)
  132.         {
  133.             next_col = color[cur_r-1][cur_c][2] ;
  134.  
  135.             if(color[cur_r][cur_c][0] == next_col) cur_pen = 0 ;
  136.             else if(color[cur_r][cur_c][1] == next_col) cur_pen = 3 ;
  137.             else if(color[cur_r][cur_c][2] == next_col) cur_pen = 2 ;
  138.             else cur_pen = 1 ;
  139.  
  140.             if(min_dist + cur_pen < dist[cur_r-1][cur_c])
  141.             {
  142.                 dist[cur_r-1][cur_c] = min_dist + cur_pen ;
  143.                 tmp.first = min_dist + cur_pen ;
  144.                 tmp.second.first = cur_r-1 ;
  145.                 tmp.second.second = cur_c ;
  146.                 Q.insert(tmp) ;
  147.             }
  148.         }
  149.     }
  150.  
  151.     cout << dist[M][N] ;
  152.  
  153.     return 0 ;
  154. }
Add Comment
Please, Sign In to add comment