Cod sursa(job #1403282)

Utilizator Johny_Depp22Johnny Depp Johny_Depp22 Data 27 martie 2015 10:31:50
Problema Matrice 2 Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <fstream>
#include <queue>
#include <cstring>
using namespace std;
class citire
{
  public:
    citire(string file, int buffsz=32768):
            buffer_size_(buffsz)
            {
        file_=fopen(file.c_str(), "r");buffer_=new char[buffsz];pointer_=buffer_+buffer_size_;
    }

    citire& operator>>(int &object)
    {
        object = 0;
        while (next()<'0' or next()>'9')advance();
        while (next()>='0' and next()<='9') {object=object*10 + next()-'0';advance();}
        return *this;
    }

  private:
    char next()
    {
        if (pointer_==buffer_+buffer_size_) {pointer_ = buffer_;fread(buffer_, 1, buffer_size_, file_);}
        return *pointer_;
    }

    void advance() {++pointer_;}
    FILE *file_;int buffer_size_;
    char *buffer_, *pointer_;
};
citire f("matrice2.in");
ofstream g("matrice2.out");

int M, N, a[305][305], stx, sty, fnx, fny, dx[4]={-1, 0, 1, 0}, dy[4]={0, -1, 0, 1}, sol, vmax;
queue < pair <int, int> > Q;
int viz[305][305];

bool check(int val)
{
    if (a[stx][sty]<val || a[fnx][fny]<val) return 0;
    Q.push(make_pair(stx, sty));
    memset(viz, 0, sizeof(viz));

    viz[stx][sty]=1;
    while (Q.size())
    {
        pair <int, int> nod=Q.front(); Q.pop();
        for (int k=0; k<4; ++k)
        {
            int auxx=nod.first+dx[k], auxy=nod.second+dy[k];
            if (a[auxx][auxy]>=val && !viz[auxx][auxy])
                viz[auxx][auxy]=1, Q.push(make_pair(auxx, auxy));
        }
    }
    return (viz[fnx][fny]);
}

int main()
{
    f>>N>>M;
    for (int i=1; i<=N; ++i)
        for (int j=1; j<=N; ++j)
            f>>a[i][j];

    while (M--)
    {
        f>>stx>>sty>>fnx>>fny;
        sol=0; vmax=max(a[stx][sty], a[fnx][fny]);
        for (int i=(1<<20); i; i>>=1)
            if (sol+i<=vmax && check(sol+i))
                sol+=i;

        g<<sol<<'\n';
    }
    return 0;
}