Pagini recente » Cod sursa (job #2913482) | Cod sursa (job #2054178) | Planificare infoarena | Cod sursa (job #2323892) | Cod sursa (job #1023448)
#include<iostream>
#include<fstream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
struct Coada
{
int x,y;
};
Coada q[1000005];
Coada inceput,sfarsit;
int R,C,pr,ul,b[1005][1005],c[1005][1005];
int dx[4]={ -1 , 0 , 1 , 0 };
int dy[4]={ 0 , 1 , 0 , -1 };
char a[1005][1005];
inline void Citire()
{
int i;
fin>>R>>C;
for (i=1;i<=R;i++)
fin>>(a[i]+1);
fin.close();
}
inline void InitCoada()
{
int i,j;
pr=1;ul=0;
for (i=1;i<=R;i++)
for (j=1;j<=C;j++)
if (a[i][j]=='D')
{ul++;
q[ul].x=i;
q[ul].y=j;
}
}
inline void Bordare()
{
int i;
for (i=0;i<=R+1;i++)
{a[i][0]=a[i][C+1]='*';
c[i][0]=c[i][C+1]=-1;
}
for (i=0;i<=C+1;i++)
{a[0][i]=a[R+1][i]='*';
c[0][i]=c[R+1][i]=-1;
}
}
inline void FormeazaMat()
{
int i,j;
Coada k,k1;
while (pr<=ul)
{
k=q[pr];
pr++;
for (i=0;i<4;i++)
{
k1.x=k.x+dx[i];
k1.y=k.y+dy[i];
if ((a[k1.x][k1.y]=='.' || a[k1.x][k1.y]=='I' || a[k1.x][k1.y]=='O') && b[k1.x][k1.y]==0)
{
ul++;
q[ul]=k1;
b[k1.x][k1.y]=b[k.x][k.y]+1;
}
}
}
}
inline bool Fill(int x,int y,int s)
{
if (b[x][y]>=s && a[x][y]!='D' && a[x][y]!='*' && c[x][y]!=-1)
{
c[x][y]=-1;
if (a[x][y]=='O') return 1;
//fout<<"x="<<x<<" "<<"y="<<y<<"\n";
Fill(x-1,y,s);
Fill(x,y+1,s);
Fill(x+1,y,s);
Fill(x,y-1,s);
}
return 0;
}
inline void CautareBin()
{
int i,j,st,dr,mij,soltemp=-1;
dr=max(R,C);
st=1;
for (i=1;i<=R;i++)
for (j=1;j<=C;j++)
{
if (a[i][j]=='I')
{inceput.x=i; inceput.y=j;}
if (a[i][j]=='O')
{sfarsit.x=i; sfarsit.y=j;}
}
while (st<=dr)
{
mij=(st+dr)/2;
Fill(inceput.x,inceput.y,mij);
if (c[sfarsit.x][sfarsit.y]==-1)
{soltemp=mij;st=mij+1;}
else dr=mij-1;
for (i=1;i<=R;i++)
for (j=1;j<=C;j++)
c[i][j]=0;
}
/*for (i=1;i<=R;i++)
{
for (j=1;j<=C;j++)
fout<<b[i][j];
fout<<"\n";
}*/
/*for (i=1;i<=R;i++)
{
for (j=1;j<=C;j++)
fout<<c[i][j]<<" ";
fout<<"\n";
}*/
/*if (c[sfarsit.x][sfarsit.y]==-1) fout<<"1\n";
else fout<<"0\n";*/
fout<<soltemp<<"\n";
}
int main()
{
Citire();
InitCoada();
Bordare();
FormeazaMat();
CautareBin();
return 0;
}