- #include<bits/stdc++.h>
- #include <utility>
- //typedef pair<int ,int>ipair;
- using namespace std;
- int grid[101][101];
- int escape_from_grid(int grid[][101],int row,int col,int sx,int sy) {
- if(sx==0 || sy==0 || sx==row-1 || sy==col-1)return 0;
- int x,y,tx,ty,i;
- int mx[4]={-1,1,0,0};
- int my[4]={0,0,1,-1};
- queue<pair<int,int>>q;
- bool vis[101][101];memset(vis,false,sizeof(vis));
- int dist[101][101];memset(dist,0,sizeof(dist));
- q.push(make_pair(sx,sy));
- int mini=101;
- dist[sx][sy]=0;
- while(!q.empty()){
- x=q.front().first;
- y=q.front().second;
- q.pop();
- for(i=0;i<4;i++){
- tx=x+mx[i];
- ty=y+my[i];
-
- if(tx<0 || ty<0)continue;
- if(tx>=row || ty>=col)continue;
- else if(!vis[tx][ty] && grid[tx][ty]==0 ){
- //cout<<tx<<" "<<ty<<endl;
- vis[tx][ty]=true;
- dist[tx][ty]=dist[x][y]+1;
- q.push(make_pair(tx,ty));
- if(tx==0 || ty==0 || tx==row-1 || ty==col-1){if(dist[tx][ty]<mini)mini=dist[tx][ty];}
- }
- }
- }
- if(mini==101)return -1;
- else return mini;
- }
-
- int main() {
-
- ios::sync_with_stdio(0);
- cin.tie(0);
- int grid_x;
- cin >> grid_x;
- int grid_y;
- cin >> grid_y;
- int sx,sy;
- for (int i_grid = 0; i_grid < grid_x; i_grid++) {
- for (int j_grid = 0; j_grid < grid_y; j_grid++) {
- cin >> grid[i_grid][j_grid];
- if(grid[i_grid][j_grid]==2){sx=i_grid;sy=j_grid;}
- }
- }
-
- int out_;
- out_ = escape_from_grid(grid,grid_x,grid_y,sx,sy);
- cout << out_;
-
- return 0;
- }
Language: C++