以前没有写过二分搜索,只知道二分快些但是不知道在搜索在二分是怎么快的,我想我要自己想的可能想不出来的。。。发现自己最近都没有怎么做出来题啊!
#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #include<stack> #include<vector> #include<climits> #include<map> using namespace std; #define rep(i,n) for(int i=0; i<n; i++) #define repf(i,n,m) for(int i=(n); i<=(m); ++i) #define repd(i,n,m) for(int i=(n); i>=(m); --i) #define max(a,b) (a)>(b)?(a):(b) #define min(a,b) (a)<(b)?(a):(b) #define fab(a) ((a)>0?(a):(0-(a))) #define ll long long #define arc(a) ((a)*(a)) #define inf 100000 #define exp 0.000001 #define N 105 int a[N][N]; bool vis[N][N]; int sign; int flag[4][2]={-1,0,1,0,0,-1,0,1}; int n; void dfs(int x,int y,int l,int r) { if(x==n && y==n) { sign=1; return ; } rep(i,4) { if(sign==1) return ; int xx=flag[i][0]+x; int yy=y+flag[i][1]; if(xx<1|| xx>n || yy<1||yy>n|| a[xx][yy]<l || a[xx][yy]>r || vis[xx][yy]==true) continue; vis[xx][yy]=true; dfs(xx,yy,l,r); // vis[xx][yy]=false; } } int main() { while(~scanf("%d",&n)) { int Max=0,Min=inf; repf(i,1,n) repf(j,1,n) { scanf("%d",&a[i][j]); Max=max(Max,a[i][j]); Min=min(Min,a[i][j]); } int l=0,r=Max-Min; while(l<=r) { sign=0; int mid=(l+r)/2; repf(i,Min,Max-mid) { if(a[1][1]<i || a[1][1]>i+mid) continue; if(a[n][n]<i || a[n][n]>i+mid) continue; vis[1][1]=true; memset(vis,false,sizeof(vis)); dfs(1,1,i,i+mid); if(sign==1) break; } if(sign==1) r=mid-1; else l=mid+1; } printf("%d\n",l); } return 0; }