Cod sursa(job #2059656)

Utilizator SchnitzelMannPavaloiu Gabriel SchnitzelMann Data 7 noiembrie 2017 13:05:14
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.55 kb
#include <iostream>
#include <cmath>
#include <fstream>
#include <cstring>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
int m,n;
int XD[1002][1002];
bool visited[1002][1002];
const int dl[]={-1,0,1,0};
const int dc[]={0,1,0,-1};
struct comp{
    short int l,c;
};
comp q[1000000];
comp dragoni[200000];
comp start;
comp vecin;
comp curent;
comp fin;
bool drum(int dist)
{
    int p=0,u=-1,i,j;
    q[++u]=start;
    for(i=1;i<=n;i++)
        for(j=0;j<m;j++)
            visited[i][j]=0;
    while(p<=u)
    {
        curent=q[p++];
        for(i=0;i<4;i++)
        {
            vecin.l=curent.l+dl[i];
            vecin.c=curent.c+dc[i];
            if(XD[vecin.l][vecin.c]>=dist&&!visited[vecin.l][vecin.c])
            {
                visited[vecin.l][vecin.c]=1;
                q[++u]=vecin;
                if(vecin.l==fin.l&&vecin.c==fin.c)
                    return 1;
            }
        }
    }
    return 0;
}
int cautare()
{
    int pas=1<<12,r=0,x=min(XD[start.l][start.c],XD[fin.l][fin.c]);
    while(pas)
    {
        if(r+pas<=x&&drum(r+pas))
            r+=pas;
        pas/=2;
    }
    return r;
}
int main()
{
    int i,j,k=0,p,u;
    char c;
    in>>n>>m;
    for(i=0;i<=n+1;i++)
    {
        XD[i][0]=-1;
        XD[i][m+1]=-1;
    }
    for(i=0;i<=m+1;i++)
    {
        XD[0][i]=-1;
        XD[n+1][i]=-1;
    }
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        {
            in>>c;
            if(c=='I')
            {
                XD[i][j]=10000000;
                start.l=i;
                start.c=j;
            }
            else if(c=='D')
            {
                dragoni[k].l=i;
                dragoni[k++].c=j;
            }
            else if(c=='O')
            {
                XD[i][j]=10000000;
                fin.l=i;
                fin.c=j;
            }
            else if(c=='.')
                XD[i][j]=10000000;
            else
                XD[i][j]=-1;
        }
    for(i=0;i<k;i++)
    {
        p=0;u=-1;
        q[++u]=dragoni[i];
        while(p<=u)
        {
            curent=q[p++];
            for(j=0;j<4;j++)
            {
                vecin.l=curent.l+dl[j];
                vecin.c=curent.c+dc[j];
                if(XD[vecin.l][vecin.c]>XD[curent.l][curent.c]+1)
                {
                    q[++u]=vecin;
                    XD[vecin.l][vecin.c]=XD[curent.l][curent.c]+1;
                }
            }
        }
    }
    out<<cautare();
    return 0;
}