POJ 2110
終于過了,SHIT,二分+DFS即可,二分區間,根據數字是否在區間內,變成迷宮題了。枚舉第一個格子,二分上界,即可。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <climits> #include <string.h> #include <queue> #include <cmath> #include <vector> using namespace std;const int N=110;int num[N][N]; bool vis[N][N]; int n,up,down; int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0} };bool ok(int tx,int ty){if(tx>=1&&tx<=n&&ty>=1&&ty<=n){if(num[tx][ty]>=down&&num[tx][ty]<=up&&!vis[tx][ty])return true;}return false; }bool dfs(int x,int y){if(x==n&&y==n) return true; vis[x][y]=true;int tx,ty;for(int i=0;i<4;i++){tx=x+dir[i][0];ty=y+dir[i][1];if(ok(tx,ty)){if(dfs(tx,ty)) return true;}}return false; }int main(){while(scanf("%d",&n)!=EOF){int r=-1,l=0,m;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){scanf("%d",&num[i][j]);r=max(num[i][j],r);}}int maxl=r;bool flag; int ans=r-l;for(int i=0;i<=num[1][1];i++){l=num[1][1]; r= maxl;while(l<=r){m=(l+r)/2;up=m,down=i;memset(vis,false,sizeof(vis));if(dfs(1,1)){ans=min(ans,up-down);r=m-1;}elsel=m+1;}}printf("%d\n",ans);}return 0; }
轉載于:https://www.cnblogs.com/jie-dcai/p/4298406.html
總結
- 上一篇: CentOS7 Tomcat安装
- 下一篇: 快手S123评级校验是什么意思