Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- // Input:
- // 5 8
- // ____ G
- // _
- // __
- // __
- // ________
- // 5 8
- // ____ G
- // __
- // _
- // ________
- // Output:
- // 3
- // 4
- int n, m, level, flag;
- int A[100][100];
- int vis[100][100];
- int x;
- int minh;
- void dfs(int x, int y){
- vis[x][y] = 1;
- if(A[x][y] == 2){
- flag = 1;
- return;
- }
- if(y-1 >= 0 && !vis[x][y-1] && A[x][y-1])
- dfs(x, y-1);
- if(y+1 < m && !vis[x][y+1] && A[x][y+1])
- dfs(x, y+1);
- int h = 1;
- while(h <= level && x+h < n){
- if(A[x+h][y] && !vis[x+h][y])
- dfs(x+h, y);
- h++;
- }
- h = 1;
- while(h <= level && x-h >= 0){
- if(A[x-h][y] && !vis[x-h][y])
- dfs(x-h, y);
- h++;
- }
- }
- void solve(){
- int h = n-1, l = 0;
- minh = n;
- while(1){
- if(l > h)
- return;
- flag = 0;
- level = (h+l)/2;
- for(int i=0; i<n; ++i)
- for(int j=0; j<m; ++j)
- vis[i][j] = 0;
- dfs(n-1, 0);
- if(!flag){
- if(level == n-1)
- return;
- l = level+1;
- }
- else{
- minh = min(minh, level);
- if(!level)
- return;
- h = level-1;
- }
- }
- }
- int main() {
- cin>>n>>m;
- char x[m+1];
- cin.getline(x, sizeof(x));
- for(int i=0; i<n; ++i){
- cin.getline(x, sizeof(x));
- for(int j=0; j<m; ++j){
- if(x[j] == ' ')
- A[i][j] = 0;
- else if(x[j] == '_')
- A[i][j] = 1;
- else if(x[j] == 'G')
- A[i][j] = 2;
- }
- }
- solve();
- cout<<((minh != n)? minh: -1);
- return 0;
- }
Add Comment
Please, Sign In to add comment