Cod sursa(job #1135252)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 7 martie 2014 16:15:09
Problema Matrice 2 Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define oo 2000000000
#define Nmax 310
#define pb push_back
using namespace std;
ifstream f("matrice2.in");
ofstream g("matrice2.out");

int N,T,a[Nmax][Nmax],b[Nmax][Nmax];
int dx[6]={0,0,0,-1,1},
    dy[6]={0,1,-1,0,0};
bool inQ[Nmax][Nmax];

struct point {int x,y;}S,F;
queue < point > Q;

inline void ReadInput()
{
     f>>N>>T;
     for(int i=1;i<=N;++i)
          for(int j=1;j<=N;++j)
               f>>b[i][j];

}

inline bool Lee(point S,point F,int H)
{
     if(b[S.x][S.y]<H || b[F.x][F.y]<H)return 0;
     memcpy(a,b,sizeof(b));
     int sol=0;
     for( Q.push(S); !Q.empty() ; Q.pop() )
     {
          point  curent=Q.front();
          for(int k=1;k<=4;++k)
          {
               int p=curent.x+dx[k],q=curent.y+dy[k];
               if(p>=1 && p<=N && q>=1 && q<=N && a[p][q]>=H)
               {
                    if(p==F.x && q==F.y)sol=1;
                    a[p][q]=-1;
                    point A; A.x=p ,A.y=q;
                    Q.push(A);
               }
          }
     }
     return sol;
}

inline int Query(point S,point F)
{
     int st=1,dr=max(b[S.x][S.y],b[F.x][F.y]),sol=0;
     while(st<=dr)
     {
          int mij=(st+dr)>>1;
          bool ok=Lee(S,F,mij);
          if(ok)
          {
               if(mij>sol)sol=mij;
               st=mij+1;
          }
          else dr=mij-1;
     }
     return sol;
}

int main()
{
     ReadInput();
     for(int i=1;i<=T;++i)
          f>>S.x>>S.y>>F.x>>F.y , g<<Query(S,F)<<'\n';
     f.close();g.close();
     return 0;
}