Cod sursa(job #1398364)

Utilizator crisovidiuCristian Ovi crisovidiu Data 24 martie 2015 10:07:51
Problema Matrice 2 Scor 30
Compilator cpp Status done
Runda oni_2009_11-12_2 Marime 2.43 kb
//#include <iostream>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <cstdio>
#include <vector>
#include <bitset>
#include <limits>
#include <fstream>
#include <cstring>
#include <iomanip>
#include <cstdlib>
#include <algorithm>
using namespace std;
ifstream cin("matrice2.in");
ofstream cout("matrice2.out");

#define nmax 310
#define mod 1000007
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define inf numeric_limits<int>::max()
#define forv(v,it) for (vector<int>::iterator it=v.begin();it!=v.end();it++)

int n,query,st,dr,inq[nmax][nmax],a[nmax][nmax],b[nmax][nmax];
int dirLin[]={0,1,0,-1},dirCol[]={1,0,-1,0};
struct elem
{
    int lin,col;
}ps,pf,p,v,q[(nmax*nmax)<<1];

int main()
{
    int i,j,k;
    cin>>n>>query;
    for (i=1;i<=n;i++)
        for (j=1;j<=n;j++)
            cin>>a[i][j];
    for (i=0;i<=n+1;i++) a[i][0]=a[i][n+1]=-1;
    for (j=0;j<=n+1;j++) a[0][j]=a[n+1][j]=-1;
    for (;query;query--)
    {
        for (i=1;i<=n;i++)
            for (j=1;j<=n;j++)
                b[i][j]=0;
        cin>>ps.lin>>ps.col;
        cin>>pf.lin>>pf.col;
        st=dr=1;
        q[dr]=ps;
        inq[ps.lin][ps.col]=1;
        b[ps.lin][ps.col]=a[ps.lin][ps.col];
        while (st<=dr)
        {
            p=q[st++];
            inq[p.lin][p.col]=0;
            for (k=0;k<4;k++)
            {
                v.lin=p.lin+dirLin[k];
                v.col=p.col+dirCol[k];
                if (a[v.lin][v.col]>0)
                {
                    if (!b[v.lin][v.col])
                    {
                        b[v.lin][v.col]=min(a[v.lin][v.col],b[p.lin][p.col]);
                        inq[v.lin][v.col]=1;
                        q[++dr]=v;
                    }
                    else if (b[p.lin][p.col]>b[v.lin][v.col])
                    {
                        b[v.lin][v.col]=min(a[v.lin][v.col],b[p.lin][p.col]);
                        if (!inq[v.lin][v.col])
                        {
                            inq[v.lin][v.col]=1;
                            q[++dr]=v;
                        }
                    }
                }
            }
            /*for (i=1;i<=n;i++)
            {
                for (j=1;j<=n;j++)
                    cout<<b[i][j]<<" ";
                cout<<'\n';
            }
            cout<<'\n';*/
        }
        cout<<b[pf.lin][pf.col]<<'\n';
    }
}