比赛 |
20160323 |
评测结果 |
AAAAAAAAAA |
题目名称 |
定向越野 |
最终得分 |
100 |
用户昵称 |
lxtgogogo |
运行时间 |
0.215 s |
代码语言 |
C++ |
内存使用 |
0.46 MiB |
提交时间 |
2016-03-23 20:42:49 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iomanip>
#include<ctime>
#include<queue>
#include<cmath>
using namespace std;
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch>'9' || ch<'0') {if(ch=='-'){f=-1;}ch=getchar();}
while(ch>='0' && ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
const int r=110;
int n=0,maxx=0,minn=1000;
int ans=1000;
int map[r][r]={};
bool vis[r][r]={};
int q[r*r][2]={},head=0,tail=0;
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
void init(){
n=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
map[i][j]=read();
if(map[i][j]>maxx) maxx=map[i][j];
if(map[i][j]<minn) minn=map[i][j];
}
}
bool check(int less,int biggest){
if(map[1][1]>biggest || map[1][1]<less) return false;
memset(vis,0,sizeof(vis));
tail=0;head=0;
q[++tail][0]=1;
q[tail][1]=1;
for(head=1;head<=tail;head++)
{
if(q[head][0]==n && q[head][1]==n) return true;
for(int i=0;i<4;i++)
{
int x=q[head][0]+dx[i];
int y=q[head][1]+dy[i];
if(x>0 && y>0 && x<=n && y<=n && !vis[x][y])
{
vis[x][y]=true;
if(map[x][y]<=biggest && map[x][y]>=less)
{
q[++tail][0]=x;
q[tail][1]=y;
}
}
}
}
return false;
}
void work(){
for(int i=minn;i<=maxx;i++)
{
int _left=0,_right=maxx-i;
while(_left+1<_right)
{
int mid=(_left+_right)>>1;
if(check(i,i+mid)) _right=mid;
else _left=mid;
}
if(check(i,i+_left)) ans=min(ans,_left);
else if(check(i,i+_right)) ans=min(ans,_right);
}
}
int main(){
freopen("adven.in","r",stdin);
freopen("adven.out","w",stdout);
init();
work();
cout<<ans<<endl;
fclose(stdin);fclose(stdout);
return 0;
}