Cod sursa(job #1153169)

Utilizator ovidiu95Decean Ovidiu Ciprian ovidiu95 Data 25 martie 2014 12:00:42
Problema Matrice 2 Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include<cstdio>
#include<cstring>
#define NMAX 310
#define MAX 100000
using namespace std;
const int vx[4]={0,1,0,-1};
const int vy[4]={1,0,-1,0};
int x1,x2,y1,y2,i,j,n,q,st,dr,mij,a[NMAX][NMAX];
int bfs(int x1,int y1,int x2,int y2, int h)
{
        int x,y,i,j,l,viz[NMAX][NMAX],sx[MAX],sy[MAX];
        memset(viz,0,sizeof(viz));
        viz[x1][y1]=1;
        sx[1]=x1; sy[1]=y1;
        l=1;
        for(i=1;i<=l;++i)
        {
            for(j=0;j<4;++j)
            {
                x=sx[i]+vx[j];
                y=sy[i]+vy[j];
                if(a[x][y]>=h && !viz[x][y])
                {
                    ++l;
                    sx[l]=x; sy[l]=y;
                    viz[x][y]=1;
                    if(x==x2&&y==y2) return 1;
                }
            }
        }
        return 0;
}

inline int minim(int a, int b){if(a<b) return a; else return b;}
int main()
{
    freopen("matrice2.in","r",stdin);
    freopen("matrice2.out","w",stdout);
    scanf("%d%d",&n,&q);
    for(i=1;i<=n;++i)
        for(j=1;j<=n;++j)
            scanf("%d",&a[i][j]);
    for(i=1;i<=q;++i)
    {
        scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
        dr=minim(a[x1][y1],a[x2][y2]);
        st=1;
        while(st!=dr)
        {
            mij=(st+dr+1)/2;
            if(bfs(x1,y1,x2,y2,mij)) st=mij; else dr=mij-1;;
        }
        printf("%d\n",st);
    }
    return 0;
}