zoukankan      html  css  js  c++  java
  • 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;
    				}
    				else
    					l=m+1;
    			}
    		}
    		printf("%d
    ",ans);
    	}
    	return 0;
    }
    	
    

      

  • 相关阅读:
    bzoj2728
    bzoj4574
    loj2554
    bzoj1068
    bzoj2554
    Exception in thread "main" java.lang.AbstractMethodError
    java方法重载,java方法练习题
    java面向对象
    java编辑器 IntelliJ IDEA 安装——放弃过程;eclipse,Notepad++
    java二维数组
  • 原文地址:https://www.cnblogs.com/jie-dcai/p/4298406.html
Copyright © 2011-2022 走看看