比赛 |
20160323 |
评测结果 |
AAAAAAAAAA |
题目名称 |
定向越野 |
最终得分 |
100 |
用户昵称 |
前鬼后鬼的守护 |
运行时间 |
0.061 s |
代码语言 |
C++ |
内存使用 |
0.48 MiB |
提交时间 |
2016-03-23 19:54:06 |
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<iostream>
#include<algorithm>
#define FILE "adven"
namespace IO{
char buf[1<<15],*fs,*ft;
inline char getc(){return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;}
inline int read(){
int x=0,rev=0,ch=getc();
while(ch<'0'||ch>'9'){if(ch=='-')rev=1;ch=getc();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getc();}
return rev?-x:x;
}
}using namespace IO;
const int MAXN(100),D(10),LIM(200);
const int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
int n,h[MAXN+D][MAXN+D];
void init(){
n=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
h[i][j]=read();
}
int qx[MAXN*MAXN+D],qy[MAXN*MAXN+D],fro,rear;
bool vis[MAXN+D][MAXN+D];
bool BFS(int low,int high){
if(h[1][1]<low||h[1][1]>high)return false;
memset(vis,0,sizeof vis);
fro=0,rear=0;
for(vis[qx[rear]=1][qy[rear]=1]=true;fro<=rear;fro++){
int x=qx[fro],y=qy[fro];
for(int i=0;i<4;i++){
int xx=x+dx[i],yy=y+dy[i];
if(xx>0&&xx<=n&&yy>0&&yy<=n&&!vis[xx][yy]&&h[xx][yy]>=low&&h[xx][yy]<=high)
rear++,vis[qx[rear]=xx][qy[rear]=yy]=true;
}
}
return vis[n][n];
}
bool check(int delta){
for(int st=0,fi=st+delta;fi<=LIM;st++,fi++)
if(BFS(st,fi))
return true;
return false;
}
void work(){
int left=0,right=LIM;
while(left<right){
int mid=(left+right)>>1;
if(check(mid))right=mid;
else left=mid+1;
}
printf("%d\n",left);
}
int main(){
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
init();
work();
return 0;
}