比赛 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;
}