Pagini recente » Cod sursa (job #571804) | Cod sursa (job #1415914) | Cod sursa (job #178974) | Cod sursa (job #1971145) | Cod sursa (job #1133614)
#include <fstream>
#include <iostream>
using namespace std;
int r,c,b[1005][1005],lista[1000005][2],marime,indice,folosit[1005][1005],x1,x2,y1,y2,mglob,minimu=-1,advr;
char a[1005][1005];
int main ()
{
ifstream in ("barbar.in");
ofstream out ("barbar.out");
in>>r>>c;
//initializare
for (int i=1;i<=r;++i) { a[i][0]='#'; a[i][c+1]='#'; }
for (int i=1;i<=c;++i) { a[0][i]='#'; a[r+1][i]='#'; }
for (int i=1;i<=r;++i)
{
for (int j=1;j<=c;++j)
{
in>>a[i][j];
}
}
marime=0;
for (int i=1;i<=r;++i)
{
for (int j=1;j<=c;++j)
{
if (a[i][j]=='D') { marime++; lista[marime][0]=i; lista[marime][1]=j; folosit[i][j]=1; }
if (a[i][j]=='I') { x1=i; y1=j; }
if (a[i][j]=='O') { x2=i; y2=j; }
}
}
indice=1; int i=lista[indice][0],j=lista[indice][1];
while (indice<=marime)
{
if (a[i][j-1]!='#' && a[i][j-1]!='*') if (folosit[i][j-1]==0) { b[i][j-1]=b[i][j]+1; folosit[i][j-1]=1; marime++; lista[marime][0]=i; lista[marime][1]=j-1; }
if (a[i-1][j]!='#' && a[i-1][j]!='*') if (folosit[i-1][j]==0) { b[i-1][j]=b[i][j]+1; folosit[i-1][j]=1; marime++; lista[marime][0]=i-1; lista[marime][1]=j; }
if (a[i][j+1]!='#' && a[i][j+1]!='*') if (folosit[i][j+1]==0) { b[i][j+1]=b[i][j]+1; folosit[i][j+1]=1; marime++; lista[marime][0]=i; lista[marime][1]=j+1; }
if (a[i+1][j]!='#' && a[i+1][j]!='*') if (folosit[i+1][j]==0) { b[i+1][j]=b[i][j]+1; folosit[i+1][j]=1; marime++; lista[marime][0]=i+1; lista[marime][1]=j; }
++indice;
if (indice<=marime) { i=lista[indice][0]; j=lista[indice][1]; }
}
for (int i=1;i<=r;++i) { a[i][0]='*'; a[i][c+1]='*'; }
for (int i=1;i<=c;++i) { a[0][i]='*'; a[r+1][i]='*'; }
int st=0,dr=1000000;
advr=-1;
while (st<=dr)
{
for (int i=1;i<=r;++i)
{
for (int j=1;j<=c;++j)
{
folosit[i][j]=0;
}
}
int m=(st+dr)/2;
advr=-1;
mglob=m;
if (b[x1][y1]>=mglob)
{
folosit[x1][y1]=1; lista[1][0]=x1; lista[1][1]=y1; marime=1;
indice=1; int i=lista[indice][0],j=lista[indice][1];
while (indice<=marime)
{
if (a[i][j]=='O')
{
indice=marime+1;
advr=1;
}else
{
if (a[i][j-1]!='*' && b[i][j-1]>=mglob && folosit[i][j-1]==0) { folosit[i][j-1]=1; ++marime; lista[marime][0]=i; lista[marime][1]=j-1;}
if (a[i-1][j]!='*' && b[i-1][j]>=mglob && folosit[i-1][j]==0) { folosit[i-1][j]=1; ++marime; lista[marime][0]=i-1; lista[marime][1]=j;}
if (a[i][j+1]!='*' && b[i][j+1]>=mglob && folosit[i][j+1]==0) { folosit[i][j+1]=1; ++marime; lista[marime][0]=i; lista[marime][1]=j+1;}
if (a[i+1][j]!='*' && b[i+1][j]>=mglob && folosit[i+1][j]==0) { folosit[i+1][j]=1; ++marime; lista[marime][0]=i+1; lista[marime][1]=j;}
++indice;
if (indice<=marime) { i=lista[indice][0]; j=lista[indice][1]; }
}
}
}
if (advr==-1) { dr=m-1; } else { if (minimu<m) minimu=m; st=m+1; }
}
out<<minimu;
in.close();
out.close();
}