Pagini recente » Cod sursa (job #2152814) | Cod sursa (job #1546780) | Cod sursa (job #1775783) | Cod sursa (job #1258385) | Cod sursa (job #2117583)
#include <fstream>
#include <cstring>
#include <iostream>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
const int N=1000;
char v[N][N];
int a[N][N];
int visited[N][N];
const int dl[]= {-1,0,1,0};
const int dc[]= {0,1,0,-1};
struct cord
{
int l;
int c;
};
cord q[N*N],p,o,x,y;
int r,c;
int sepoate(int super)
{
int dr=-1,st=0,i,j;
q[++dr]=p;
for(i=1 ; i<=r ; i++)
{
for(j=1 ; j<=c ; j++)
{
visited[i][j]=0;
}
}
visited[p.l][p.c]=1;
while(st<=dr)
{
x=q[st++];
for(i=0 ; i<4 ; i++)
{
y.l=x.l+dl[i];
y.c=x.c+dc[i];
if((a[y.l][y.c]>=super || a[y.l][y.c]==-3) && visited[y.l][y.c]==0)
{
q[++dr]=y;
visited[y.l][y.c]++;
}
}
}
return visited[o.l][o.c];
}
int main()
{
int i,j,dr=-1,st=0,mij,cst,cdr;
in>>r>>c>>ws;
for(i=1 ; i<=r ; i++)
{
in.getline(1+v[i],N);
for(j=1 ; j<=c ; j++)
{
if(v[i][j]=='I')
{
a[i][j]=-2;
p.l=i;
p.c=j;
}
else if(v[i][j]=='D')
{
a[i][j]=0;
dr++;
q[dr].l=i;
q[dr].c=j;
}
else if(v[i][j]=='*')
{
a[i][j]=0;
}
else if(v[i][j]=='.')
{
a[i][j]=-1;
}
else if(v[i][j]=='O')
{
a[i][j]=-3;
o.l=i;
o.c=j;
}
}
}
while(st<=dr)
{
x=q[st];
st++;
for(i=0 ; i<4 ; i++)
{
y.l=x.l+dl[i];
y.c=x.c+dc[i];
if(a[y.l][y.c]!=0)
{
if(a[y.l][y.c]==-1)
{
a[y.l][y.c]=a[x.l][x.c]+1;
q[++dr]=y;
}
else if(a[y.l][y.c]>(a[x.l][x.c]+1))
{
a[y.l][y.c]=a[x.l][x.c]+1;
q[++dr]=y;
}
}
}
}
st=1;
dr=r+c;
while(st!=dr)
{
mij=st+dr;
mij/=2;
cst=st;
cdr=dr;
if(sepoate(mij)==0)
{
dr=mij;
}
if(sepoate(mij)==1)
{
st=mij;
}
if(st==cst && dr==cdr)
{
if(sepoate(st)==0)
{
st=dr;
}
else
{
dr=st;
}
}
}
out<<st;
return 0;
}