You are on page 1of 1

#include <fstream>

#include <queue>
#define N 1001
using namespace std;
const int dx[]={-1,0,1, 0},
dy[]={ 0,1,0,-1};
int n,a[N][N],rez,v[N][N],pas=1<<16;
queue <pair<int,int>> Q;

int Lee(int k)
{
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
v[i][j]=0;
if(a[1][1]<=k)
Q.push(make_pair(1,1));
else
return 0;
while(Q.size()&&!v[n][n])
{
int x=Q.front().first;
int y=Q.front().second;
Q.pop();
for(int i=0;i<4;++i)
{
int xx=x+dx[i];
int yy=y+dy[i];
if(!v[xx][yy]&&a[xx][yy]<=k)
v[xx][yy]=1,Q.push(make_pair(xx, yy));
}
}
while(Q.size())
Q.pop();
return v[n][n];
}

int main()
{
ifstream f("labirint.in");
f>>n;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
f>>a[i][j];
f.close();
for(int i=0;i<=n+1;++i)
for(int j=0;j<=n+1;++j)
v[i][j]=1;
for(;pas;pas>>=1)
if(!Lee(rez+pas))
rez+=pas;
ofstream g("labirint.out");
g<<rez+1;
g.close();
return 0;
}

You might also like