Cod sursa(job #1820685)

Utilizator Johnny07Savu Ioan-Daniel Johnny07 Data 2 decembrie 2016 01:22:14
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 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;
    for (i=1;i<=n;i++)
        for (j=1;j<=m;j++) b[i][j]=0;
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 ((a[l][c+1]>=k || a[l][c+1]==0) && b[l][c+1]==0) {p++;lin[p]=l;col[p]=c+1;b[l][c+1]=b[l][c]+1;}
    if ((a[l][c-1]>=k || a[l][c-1]==0) && b[l][c-1]==0) {p++;lin[p]=l;col[p]=c-1;b[l][c-1]=b[l][c]+1;}
    if ((a[l+1][c]>=k || a[l+1][c]==0) && b[l+1][c]==0) {p++;lin[p]=l+1;col[p]=c;b[l+1][c]=b[l][c]+1;}
    if ((a[l-1][c]>=k || a[l-1][c]==0) && 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]=0;p++;lin[p]=i;col[p]=j+1;}
        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;}
    }
}
int auxp=p;
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;
}
for (i=1;i<=p;i++)
{
    l=lin[i];
    c=col[i];
    if (a[l][c+1]==0) {p++;lin[p]=l;col[p]=c+1;a[l][c+1]=a[l][c]+1;}
    if (a[l][c-1]==0) {p++;lin[p]=l;col[p]=c-1;a[l][c-1]=a[l][c]+1;}
    if (a[l+1][c]==0) {p++;lin[p]=l+1;col[p]=c;a[l+1][c]=a[l][c]+1;}
    if (a[l-1][c]==0) {p++;lin[p]=l-1;col[p]=c;a[l-1][c]=a[l][c]+1;}
}
for (i=1;i<=auxp;i++) a[lin[i]][col[i]]=-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;
if (solve(mid)==0) mid--;
if (solve(mid)==1) g<<mid;
else g<<-1;

    return 0;
}