Cod sursa(job #1820673)

Utilizator Johnny07Savu Ioan-Daniel Johnny07 Data 2 decembrie 2016 00:44:38
Problema Barbar Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");

char ch[1010];
int n,m,a[1010][1010],b[1010][1010],lin[1100000],col[1100000],p,lf,cf,l,c,st,dr,mid,x,li,ci;

int solve(int k)
{
    int i,j,t,l,c;
    l=li;
    c=ci;
for (i=1;i<=n;i++)
{
    for (j=1;j<=m;j++)
    {
    b[i][j]=a[i][j];
    }
}
for (i=1;i<=n;i++)
{
    for (j=1;j<=m;j++)
    {
        if (b[i][j]==2)
        {
            for (t=1;t<=k;t++)
            {
                if (j-t>=0) b[i][j-t]=1;
                if (i-t>=0) b[i-t][j]=1;
                b[i+t][j]=1;
                b[i][j+t]=1;
            }
        }
    }
}
/*
cout<<n<<" "<<m<<"\n";
for (i=1;i<=n;i++)
{
    cout<<"\n";
    for (j=1;j<=m;j++) cout<<b[i][j]<<" ";
}
*/
if (b[li][ci]==0)
{
p=1;
lin[p]=li;
col[p]=ci;
b[li][ci]=1;
for (i=1;i<=p;i++)
{
    l=lin[i];
    c=col[i];
    if (b[l][c+1]==0) {p++;lin[p]=l;col[p]=c+1;b[l][c+1]=b[l][c]+1;}
    if (b[l][c-1]==0) {p++;lin[p]=l;col[p]=c-1;b[l][c-1]=b[l][c]+1;}
    if (b[l+1][c]==0) {p++;lin[p]=l+1;col[p]=c;b[l+1][c]=b[l][c]+1;}
    if (b[l-1][c]==0) {p++;lin[p]=l-1;col[p]=c;b[l-1][c]=b[l][c]+1;}
}

if (b[lf][cf]>0) return 1;
else return 0;


}
else return 0;



}


int main()
{
    int i,j;
f>>n>>m;
f.getline (ch,2);
for (i=1;i<=n;i++)
{
    f.getline (ch,1010);
    for (j=0;j<=m-1;j++)
    {
        if (ch[j]=='D') {a[i][j+1]=2;}
        if (ch[j]=='*') {a[i][j+1]=1;}
        if (ch[j]=='I') {li=i;ci=j+1;}
        if (ch[j]=='O') {lf=i;cf=j+1;}
    }
}

for (i=0;i<=n+1;i++)
{
    a[i][0]=-1;
    a[i][m+1]=-1;
        b[i][0]=-1;
    b[i][m+1]=-1;
}
for (j=0;j<=m+1;j++)
{
        b[0][j]=-1;
    b[n+1][j]=-1;
    a[0][j]=-1;
    a[n+1][j]=-1;
}
st=1;
dr=1000;
while (st<=dr)
{
    mid=(st+dr)/2;
    x=solve(mid);
    if (x==1) st=mid+1;
    else dr=mid-1;
}

mid=(st+dr)/2;
x=solve(mid);
if(x==0) mid--;
x=solve(mid);
if (x==1) g<<mid;
else g<<-1;

//x=solve(3);
//cout<<"\n"<<x;

    return 0;
}