POJ 2110

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 }

你可能感兴趣的:(poj)