记录编号 240963 评测结果 AAAAAAAAAA
题目名称 定向越野 最终得分 100
用户昵称 GravatarZXCVBNM_1 是否通过 通过
代码语言 C++ 运行时间 0.078 s
提交时间 2016-03-24 10:02:31 内存使用 0.45 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define INF 1e9
int n,a[110][110],qx[10020],qy[10020],pd,MX,MN;
int fx[6]={0,0,1,-1};
int fy[6]={1,-1,0,0};
bool vis[110][110];
/*void dfs(int x,int y,int K)
{
    int MX1,MN1,xx,yy,i;
    if(pd==1)return;
    if(MX-MN>K)return;
    //if(x<1||x>n||y<1||y>n)return;
    if(x==n&&y==n)
    {
        if(MX-MN<=K)pd=1;
        return;
    }
    for(i=0;i<=3;i++)
    {
        xx=x+fx[i];
        yy=y+fy[i];
        if(xx>=1&&xx<=n&&yy>=1&&yy<=n&&vis[xx][yy]==false)
        {
            MX1=MX;MN1=MN;
            if(a[xx][yy]>MX)MX=a[xx][yy];
            if(a[xx][yy]<MN)MN=a[xx][yy];
            vis[xx][yy]=true;
            dfs(x+fx[i],y+fy[i],K);
            vis[xx][yy]=false;
            MX=MX1;MN=MN1;
        }
    }
}*/
int BFS(int low,int high)
{
    int head,tail,ux,uy,vx,vy,i;
    if(a[1][1]<low||a[1][1]>high)return 0;
    head=0;tail=1;
    qx[tail]=1;qy[tail]=1;
    memset(vis,false,sizeof(vis));vis[1][1]=true;
    while(head!=tail)
    {
        head++;if(head==10010)head=0;
        ux=qx[head];uy=qy[head];
        for(i=0;i<=3;i++)
        {
            vx=ux+fx[i];
            vy=uy+fy[i];
            if(vx>=1&&vx<=n&&vy>=1&&vy<=n&&a[vx][vy]>=low&&a[vx][vy]<=high&&vis[vx][vy]==false)
            {
                vis[vx][vy]=true;
                tail++;if(tail==10010)tail=0;
                qx[tail]=vx;qy[tail]=vy;
                if(vx==n&&vy==n)return 1;
            }
        }
    }
    return 0;
}
int Judge(int k)
{
    int low;
    //MX=a[1][1];MN=a[1][1];
    //memset(vis,false,sizeof(vis));vis[1][1]=true;pd=0;
    for(low=0;low+k<=200;low++)if(BFS(low,low+k)==1)return 1;
    return 0;
}
int main()
{
    freopen("adven.in","r",stdin);
    freopen("adven.out","w",stdout);
    int i,j,l,r,mid,ans;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    l=0;r=200;
    while(l<=r)
    {
        mid=(l+r)/2;
        if(Judge(mid)==1){ans=mid;r=mid-1;}
        else l=mid+1;
    }
    printf("%d",ans);
    fclose(stdin);
    fclose(stdout);
    return 0;
}