Cod sursa(job #1194410)

Utilizator narcis_vsGemene Narcis - Gabriel narcis_vs Data 3 iunie 2014 19:56:26
Problema A+B Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 6.39 kb
#include<cstdio>
#include<queue>
#include<vector>
#include <fstream>
#include <cstring>
#include <cstdlib>
#include<algorithm>
#define max(a,b) ( ( ( a ) >= ( b ) ) ? ( a ) : (b) )
#define min(a,b) ( ( ( a ) <= ( b ) ) ? ( a ) : (b) )
#define abs(a)   ( ( ( a ) >= 0 ) ? ( a ) : (- ( a ) ) )
#define In "adunare.in"
#define Out "adunare.out"
#define  N 1003
using namespace std;

char *buffer;
inline void Citeste(int &x)
{
    while(*buffer<'0' || '9' < *buffer )buffer++;
    x = 0;
    while('0'<=*buffer && *buffer <='9')
        x = x*10+*buffer-'0',buffer++;
}
inline void Init_Buffer()
{
    ifstream fin(In);
    fin.seekg(0,ios::end);
    int fs = fin.tellg();
    buffer = (char*)malloc(fs);
    fin.seekg(0,ios::beg);
    fin.getline(buffer,fs,NULL);
    fin.close();
}
struct Coord
{
    int lin,col,cost;
    bool operator < ( const Coord &z) const
    {
        return cost >z.cost;
    }
};

priority_queue<Coord>q;
Coord tinta,sursa1,sursa2,r;
vector<Coord>obs,v1,v2;
int a[N][N],A,B,b[N][N],n,sol;
ofstream fout(Out);
void Citire()
{
    int i,k;
    Citeste(A);
    Citeste(B);
    return ;
    Citeste(n);
    Citeste(tinta.lin);Citeste(tinta.col);
    a[tinta.lin][tinta.col] = -1;
    b[tinta.lin][tinta.col] = -1;
    Citeste(sursa1.lin);Citeste(sursa1.col);
    Citeste(sursa2.lin);Citeste(sursa2.col);
    Citeste(r.lin);Citeste(r.col);
    r.cost = 1;
    q.push(r);
    Citeste(r.lin);Citeste(r.col);Citeste(k);
    Coord r;
    for(i=0;i<k;i++)
    {
        Citeste(r.lin);Citeste(r.col);
        obs.push_back(r);
        a[r.lin][r.col] = -1;
        b[r.lin][r.col] = -1;
    }
}

void Bordare()
{
    int i;
    for(i=0;i<=n+1;i++)
    {
        a[i][0] = a[0][i] = a[n+1][i] = a[i][n+1] = -1;
        b[i][0] = b[0][i] = b[n+1][i] = b[i][n+1] = -1;
    }
}

inline bool Slin(Coord A,Coord B)
{
    if(A.lin==B.lin)
        return A.col<B.col;
    return A.lin<B.lin;
}
inline bool Scol(Coord A,Coord B)
{
    if(A.col==B.col)
        return A.lin<B.lin;
    return A.col < B.col;
}

void Cerinta_a()
{
    int i,x,k;
    k = obs.size();
    sort(obs.begin(),obs.end(),Slin);
    x = 1;
    for(i=1;i<k;i++)
    {
        if(obs[i].lin==obs[i-1].lin && obs[i-1].col+1 == obs[i].col)
            x++;
        else
            x = 1;
        sol = max(sol,x);
    }
    sort(obs.begin(),obs.end(),Scol);
    x = 1;
    for(i=1;i<k;i++)
    {
        if(obs[i].col==obs[i-1].col&& obs[i-1].lin+1 == obs[i].lin)
            x++;
        else
            x =1;
        sol = max(sol,x);
    }
}
inline int Cmmdc(int x,int y)
{
    int r;
    while(y!=0)
    {
        r = x%y;
        x = y;
        y = r;
    }
    return x;
}

inline void Lee(int a[N][N])
{
    Coord p,v;
    int i;
    int dl[] ={ 1, 0,-1, 0};
    int dc[] ={ 0, 1, 0,-1};
    a[q.top().lin][q.top().col] = 1;
    while(!q.empty())
    {
        p = q.top();
        q.pop();
        for(i=0;i<4;i++)
        {
            v.lin = p.lin + dl[i];
            v.col = p.col + dc[i];
            if(a[v.lin][v.col]!=-1)
            {
                if(a[v.lin][v.col]==0)
                {
                    a[v.lin][v.col] = a[p.lin][p.col]+1;
                    v.cost = a[v.lin][v.col];
                    q.push(v);
                }
                else
                    if(a[v.lin][v.col] > a[p.lin][p.col] +1)
                    {
                        a[v.lin][v.col] = a[p.lin][p.col]+1;
                        v.cost = a[v.lin][v.col];
                        q.push(v);
                    }
            }
        }
    }
}

inline void Cerinta_b()
{
    int i,j,n,m,y,z;
    sol = A+B;
    fout<<sol<<"\n";
    int sl,sc,cm,dl,dc;
    Coord x;
    x.lin = sursa1.lin ;
    x.col = sursa1.col ;

    if(tinta.lin < x.lin )
        sl = -1;
    else
        sl  = 1;
    if(tinta.col < x.col )
        sc = -1;
    else
        sc = 1;return;
    if(x.lin==tinta.lin)
    {
        do
        {
            v1.push_back(x);
            x.col = x.col + 1 * sc;
        }
        while(x.col!=tinta.col);
    }
    else
        if(x.col==tinta.col)
        {
            do
            {
                v1.push_back(x);
                x.lin = x.lin + 1 * sl;
            }
            while(x.lin!=tinta.lin);
        }
        else
        {
            dl = abs(x.lin-tinta.lin);
            dc = abs(x.col-tinta.col);
            cm = Cmmdc(dl,dc);
            dl /= cm;
            dc /= cm;
            do
            {
                v1.push_back(x);

                x.lin = x.lin + dl*sl;
                x.col = x.col + dc*sc;
            }
            while(x.lin != tinta.lin || x.col != tinta.col );
        }

    x.lin = sursa2.lin ;
    x.col = sursa2.col ;

    if(tinta.lin < x.lin )
        sl = -1;
    else
        sl  = 1;
    if(tinta.col < x.col )
        sc = -1;
    else
        sc = 1;
    if(x.lin==tinta.lin)
    {
        do
        {
            v2.push_back(x);
            x.col = x.col + 1 * sc;
        }
        while(x.col!=tinta.col);
    }
    else
        if(x.col==tinta.col)
        {
            do
            {
                v2.push_back(x);
                x.lin = x.lin + 1 * sl;
            }
            while(x.lin!=tinta.lin);
        }
    else
    {
        dl = abs(x.lin-tinta.lin);
        dc = abs(x.col-tinta.col);
        cm = Cmmdc(dl,dc);
        dl /= cm;
        dc /= cm;
        do
        {
            v2.push_back(x);
            x.lin = x.lin + dl*sl;
            x.col = x.col + dc*sc;
        }
        while(x.lin != tinta.lin || x.col != tinta.col );
    }


    n = v1.size();
    m = v2.size();

    Lee(a);
    q.push(r);
    Lee(b);

    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
        {
            z = a[v1[i].lin][v1[i].col];
            y = b[v2[j].lin][v2[j].col];
            if(z>0 && y>0)
            {
                z = max(z,y);
                sol = min(sol, z );
            }
            z = a[v2[j].lin][v2[j].col];
            y = b[v1[i].lin][v1[i].col];
            if(z>0 && y>0)
            {
                z = max(z,y);
                sol = min(sol, z );
            }
        }
    fout.close();
}

int main()
{
    Init_Buffer();
    Citire();
    Bordare();
    Cerinta_a();
    Cerinta_b();
    return 0;
}