urmisaha

Samsung-Rock Climbing

Nov 5th, 2019
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.78 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. // Input:
  6. // 5 8
  7. // ____   G
  8. //       _
  9. //      __
  10. //       __
  11. // ________
  12.  
  13. // 5 8
  14. // ____   G
  15.        
  16. //      __
  17. //       _
  18. // ________
  19.  
  20. // Output:
  21. // 3
  22. // 4
  23.  
  24. int n, m, level, flag;
  25. int A[100][100];
  26. int vis[100][100];
  27. int x;
  28. int minh;
  29.  
  30. void dfs(int x, int y){
  31.     vis[x][y] = 1;
  32.     if(A[x][y] == 2){
  33.         flag = 1;
  34.         return;
  35.     }
  36.     if(y-1 >= 0 && !vis[x][y-1] && A[x][y-1])
  37.         dfs(x, y-1);
  38.     if(y+1 < m && !vis[x][y+1] && A[x][y+1])
  39.         dfs(x, y+1);
  40.     int h = 1;
  41.     while(h <= level && x+h < n){
  42.         if(A[x+h][y] && !vis[x+h][y])
  43.             dfs(x+h, y);
  44.         h++;
  45.     }
  46.     h = 1;
  47.     while(h <= level && x-h >= 0){
  48.         if(A[x-h][y] && !vis[x-h][y])
  49.             dfs(x-h, y);
  50.         h++;
  51.     }
  52. }
  53.  
  54. void solve(){
  55.     int h = n-1, l = 0;
  56.     minh = n;
  57.     while(1){
  58.         if(l > h)
  59.             return;
  60.         flag = 0;
  61.         level = (h+l)/2;
  62.         for(int i=0; i<n; ++i)
  63.             for(int j=0; j<m; ++j)
  64.                 vis[i][j] = 0;
  65.         dfs(n-1, 0);
  66.         if(!flag){
  67.             if(level == n-1)
  68.                 return;
  69.             l = level+1;
  70.         }
  71.         else{
  72.             minh = min(minh, level);
  73.             if(!level)
  74.                 return;
  75.             h = level-1;
  76.         }
  77.     }
  78. }
  79.  
  80. int main() {
  81.     cin>>n>>m;
  82.     char x[m+1];
  83.     cin.getline(x, sizeof(x));
  84.     for(int i=0; i<n; ++i){
  85.         cin.getline(x, sizeof(x));
  86.         for(int j=0; j<m; ++j){
  87.             if(x[j] == ' ')
  88.                 A[i][j] = 0;
  89.             else if(x[j] == '_')
  90.                 A[i][j] = 1;
  91.             else if(x[j] == 'G')
  92.                 A[i][j] = 2;
  93.         }
  94.     }
  95.     solve();
  96.     cout<<((minh != n)? minh: -1);
  97.     return 0;
  98. }
Add Comment
Please, Sign In to add comment