Cod sursa(job #1078038)

Utilizator costel93FMI - Dumea Eduard Constantin costel93 Data 11 ianuarie 2014 22:42:03
Problema Matrice 2 Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.91 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;
queue<str2> q2;

bool verific(int nr)
{
    aux.x=x1;
    aux.y=y;

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

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

    if(a[x1][y]>=nr)
    {
        q.push(aux);
        a[aux.x][aux.y] = 0;
        q2.push(s);
        while(!q.empty() )
        {
            aux2=q.front();
            q.pop();


            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]=0;
            }
            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]=0;
            }
            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]=0;
            }
            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]=0;
            }

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

                return true;
            }

        }

        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, 1000);
        fout<<sol<<"\n";
    }



    return 0;
}