Pagini recente » Cod sursa (job #1835597) | Cod sursa (job #467861) | Cod sursa (job #12054) | Borderou de evaluare (job #528044) | Cod sursa (job #1474168)
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
char a[1005][1005],t[1005][1005];
int b[1005][1005];
int r,c;
int dx[]={0,1,-1, 0};
int dy[]={1,0, 0,-1};
queue <pair<int , int> > q;
int xi,yi,xo,yo;
void Citire()
{
int i,j;
fin>>r>>c;
for(i=1;i<=r;i++)
fin>>(a[i]+1);
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
{
b[i][j]=2000000;
if(a[i][j]=='I')
{
xi=i;
yi=j;
a[i][j]='.';
}
else if(a[i][j]=='O')
{
xo=i;
yo=j;
a[i][j]='.';
}
}
fin.close();
}
void Bordare()
{
int i;
for(i=0;i<=c+1;i++)
a[0][i]=a[r+1][i] = '*';
for(i=0;i<=r+1;i++)
a[i][0]=a[i][c+1] = '*';
}
void Lee()
{
int i,j,x,y,k;
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
if(a[i][j]=='D')
{
q.push(make_pair(i,j));
b[i][j]=0;
}
while(!q.empty())
{
x=q.front().first;
y=q.front().second;
q.pop();
for(k=0;k<=3;k++)
{
i=x+dx[k];
j=y+dy[k];
if(a[i][j]!='*'&&b[i][j]>b[x][y]+1)
{
b[i][j]=b[x][y]+1;
q.push(make_pair(i,j));
}
}
}
}
void Fill(int i,int j,int d)
{
t[i][j]='1';
if(b[i-1][j]>=d&&a[i-1][j]=='.'&&t[i-1][j]=='0')
Fill(i-1,j,d);
if(b[i][j-1]>=d&&a[i][j-1]=='.'&&t[i][j-1]=='0')
Fill(i,j-1,d);
if(b[i+1][j]>=d&&a[i+1][j]=='.'&&t[i+1][j]=='0')
Fill(i+1,j,d);
if(b[i][j+1]>=d&&a[i][j+1]=='.'&&t[i][j+1]=='0')
Fill(i,j+1,d);
}
void InitT()
{
int i, j;
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
t[i][j] = '0';
}
int DistMax()
{
int dmax, st, dr,mij;
st = 1; dr = b[xi][yi];
dmax = 0;
while (st <= dr)
{
mij = (st + dr) / 2;
InitT();
Fill(xi,yi,mij);
if (t[xo][yo] == '1') {dmax = mij;st = mij + 1;}
dr = mij - 1;
}
return dmax;
}
int main()
{
int i;
Citire();
Bordare();
Lee();
i=DistMax();
fout<<i<<"\n";
fout.close();
return 0;
}