nyoj 306 搜索+二分

来源:互联网 发布:java工程师的职业规划 编辑:程序博客网 时间:2024/05/01 06:02
#include#includeint st[105][105];int vi[105][105];int ans;int max,min;int n,fla;int fx[]={0,0,1,-1};int fy[]={1,-1,0,0};void dfs(int x,int y,int ma,int min){// printf("%d %dxyxy\n",x,y);if(fla)return;if(x==n-1&&y==n-1){fla=1;// printf("%d %dff\n",ma,min);return;}for(int i=0;i<4;i++){// printf("%d %d fx\n",fx[i],fy[i]);int xx=x+fx[i];int yy=y+fy[i];// printf("%d %d xxyy\n",xx,yy);if(st[xx][yy]>=min&&st[xx][yy]<=ma&&!vi[xx][yy]&&xx>=0&&yy>=0){vi[xx][yy]=1;dfs(xx,yy,ma,min);//vi[xx][yy]=0;  此处}}}int find(int mm){for(int i=min;i<=max-mm;i++){if(st[0][0]<i||st[0][0]>i+mm)continue;if(st[n-1][n-1]<i||st[n-1][n-1]>i+mm)continue;fla=0;memset(vi,0,sizeof(vi));vi[0][0]=1;dfs(0,0,i+mm,i);if(fla)return 1;}return 0;}int main(){while(~scanf("%d",&n)){memset(st,-1,sizeof(st));for(int i=0;i<n;i++)for(int j=0;j<n;j++){int a;scanf("%d",&a);if(a>max)max=a;if(a<min)min=a;st[i][j]=a;}int jw=max-min;int ks=0,mid;while(jw>ks){// printf("%dmid\n",mid);mid=(jw+ks)/2;int fl=find(mid);if(fl)jw=mid;elseks=mid+1;}printf("%d\n",jw);}}

0 0
原创粉丝点击