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