O(n^3log(n))47MS水过,枚举高度差log(n),枚举最低高度n,dfs一遍n^2

View Code
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 bool mark[105][105];
 6 int map[105][105];
 7 int n;
 8 bool dfs(int x,int y,int mmin,int len)
 9 {
10     mark[x][y]=true;
11     if(x==n&&y==n)
12         return true;
13     bool flag=false;
14     if(x<n&&!mark[x+1][y]&&map[x+1][y]<=mmin+len&&map[x+1][y]>=mmin)
15         flag|=dfs(x+1,y,mmin,len);
16     if(x>1&&!mark[x-1][y]&&map[x-1][y]<=mmin+len&&map[x-1][y]>=mmin)
17         flag|=dfs(x-1,y,mmin,len);
18     if(y>1&&!mark[x][y-1]&&map[x][y-1]<=mmin+len&&map[x][y-1]>=mmin)
19         flag|=dfs(x,y-1,mmin,len);
20     if(y<n&&!mark[x][y+1]&&map[x][y+1]<=mmin+len&&map[x][y+1]>=mmin)
21         flag|=dfs(x,y+1,mmin,len);
22     return flag;
23 }
24 bool solve(int mid)
25 {
26     int t=map[1][1];
27     for(int i=max(t-mid,0);i<=t;i++)
28     {
29         memset(mark,false,sizeof(mark));
30         if(dfs(1,1,i,mid))
31             return true;
32     }
33     return false;
34 }
35 int main()
36 {
37     while(scanf("%d",&n)!=EOF)
38     {
39         for(int i=1;i<=n;i++)
40             for(int j=1;j<=n;j++)
41                 scanf("%d",&map[i][j]);
42         int ans=0,ll,rr,mid;
43         for(ll=0,rr=110;ll<=rr;)
44         {
45             mid=(ll+rr)>>1;
46             if(solve(mid))
47             {
48                 ans=mid;
49                 rr=mid-1;
50             }
51             else
52             {
53                 ll=mid+1;
54             }
55         }
56         printf("%d\n",ans);
57     }
58     return 0;
59 }