#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++