Cod sursa(job #1081353)

Utilizator costel93FMI - Dumea Eduard Constantin costel93 Data 13 ianuarie 2014 15:48:12
Problema Matrice 2 Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 5.12 kb
#include <fstream>
#include <iostream>
#include <math.h>
#include <queue>

using namespace std;

int n, m, x1, x2, y2, i, j, a[305][305], y, sol;

typedef struct str{int x; int y;};
typedef struct str2{int x; int y; int val;};

str2 s;
str aux, aux2;

queue<str> q, r;
queue<str2> q2;

bool verific(int nr)
{
    int i, j;

    //cout<<nr<<"       "<<x1<<" "<<y<<"  "<<a[x1][y]<<"\n";

    if(a[x1][y]>=nr && a[x2][y2])
    {
         aux.x=x1;
        aux.y=y;

        s.x=aux.x;
        s.y=aux.y;
        s.val=a[aux.x][aux.y];

        q.push(aux);
        a[aux.x][aux.y] = -1;
        q2.push(s);


        aux.x=x2;
        aux.y=y2;

        s.x=aux.x;
        s.y=aux.y;
        s.val=a[aux.x][aux.y];

        r.push(aux);
        a[aux.x][aux.y] = -2;
        q2.push(s);



        while(!q.empty() && !r.empty())
        {
            aux2=q.front();
            q.pop();

            if(a[aux2.x-1][aux2.y] == -2 || a[aux2.x+1][aux2.y] == -2 || a[aux2.x][aux2.y-1] == -2 || a[aux2.x][aux2.y+1] == -2 )
            {
                while(!q.empty())
                    q.pop();
                while(!r.empty())
                    r.pop();


                while(!q2.empty())
                {
                    s=q2.front();
                    q2.pop();
                    a[s.x][s.y]=s.val;
                }



                return true;
            }

            if( a[aux2.x-1][aux2.y] >= nr )
            {
                aux.x=aux2.x-1;
                aux.y=aux2.y;
                q.push(aux);
                s.x=aux.x;
                s.y=aux.y;
                s.val=a[aux.x][aux.y];
                q2.push(s);
                a[aux.x][aux.y]=-1;
            }
            if( a[aux2.x+1][aux2.y] >= nr )
            {
                aux.x=aux2.x+1;
                aux.y=aux2.y;
                q.push(aux);
                s.x=aux.x;
                s.y=aux.y;
                s.val=a[aux.x][aux.y];
                q2.push(s);
                a[aux.x][aux.y]=-1;
            }
            if( a[aux2.x][aux2.y-1] >= nr )
            {
                aux.x=aux2.x;
                aux.y=aux2.y-1;
                q.push(aux);
                s.x=aux.x;
                s.y=aux.y;
                s.val=a[aux.x][aux.y];
                q2.push(s);
                a[aux.x][aux.y]=-1;
            }
            if( a[aux2.x][aux2.y+1] >= nr )
            {
                aux.x=aux2.x;
                aux.y=aux2.y+1;
                q.push(aux);
                s.x=aux.x;
                s.y=aux.y;
                s.val=a[aux.x][aux.y];
                q2.push(s);
                a[aux.x][aux.y]=-1;
            }



            aux2=r.front();
            r.pop();

            if(a[aux2.x-1][aux2.y] == -1 || a[aux2.x+1][aux2.y] == -1 || a[aux2.x][aux2.y-1] == -1 || a[aux2.x][aux2.y+1] == -1 )
            {
                while(!q.empty())
                    q.pop();
                while(!r.empty())
                    r.pop();

                while(!q2.empty())
                {
                    s=q2.front();
                    q2.pop();
                    a[s.x][s.y]=s.val;
                }

                return true;
            }

            if( a[aux2.x-1][aux2.y] >= nr )
            {
                aux.x=aux2.x-1;
                aux.y=aux2.y;
                r.push(aux);
                s.x=aux.x;
                s.y=aux.y;
                s.val=a[aux.x][aux.y];
                q2.push(s);
                a[aux.x][aux.y]=-2;
            }
            if( a[aux2.x+1][aux2.y] >= nr )
            {
                aux.x=aux2.x+1;
                aux.y=aux2.y;
                r.push(aux);
                s.x=aux.x;
                s.y=aux.y;
                s.val=a[aux.x][aux.y];
                q2.push(s);
                a[aux.x][aux.y]=-2;
            }
            if( a[aux2.x][aux2.y-1] >= nr )
            {
                aux.x=aux2.x;
                aux.y=aux2.y-1;
                r.push(aux);
                s.x=aux.x;
                s.y=aux.y;
                s.val=a[aux.x][aux.y];
                q2.push(s);
                a[aux.x][aux.y]=-2;
            }
            if( a[aux2.x][aux2.y+1] >= nr )
            {
                aux.x=aux2.x;
                aux.y=aux2.y+1;
                r.push(aux);
                s.x=aux.x;
                s.y=aux.y;
                s.val=a[aux.x][aux.y];
                q2.push(s);
                a[aux.x][aux.y]=-2;
            }



        }

        while(!q2.empty())
        {
            s=q2.front();
            q2.pop();
            a[s.x][s.y]=s.val;
        }
    }
    return false;


}

void bin(int l, int r)       ///////////
{
    int m = (l+r)/2;

    //cout<<"MIJLOCUL: "<<l<<" "<<r<<" "<<m<<"\n\n";

    if(l > r)
        return;
    if(verific(m))
    {
        sol = m;
        bin(m+1, r);
    }
    else
        bin(l, m-1);
}

int main()
{

    ifstream fin("matrice2.in");
    ofstream fout("matrice2.out");

    fin>>n>>m;

    for(i = 1; i<=n; i++ )
        for( j=1; j<=n; j++ )
            fin>>a[i][j];

    for(i=1; i<= m ; i++ )
    {
        fin>>x1>>y>>x2>>y2;
        bin(1, min(a[x1][y], a[x2][y2]));
        fout<<sol<<"\n";
    }



    return 0;
}