Pagini recente » Cod sursa (job #2142719) | Cod sursa (job #2629891) | Cod sursa (job #67114) | Cod sursa (job #2621270) | Cod sursa (job #1069985)
#include <fstream>
#include <algorithm>
#include<vector>
#include<set>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
struct coada
{
int x,y;
}c[1000050];
coada v[1000050];
int componente,i,aux,n,k,j,p,s,unu,t,m,doi,x,q,st,dr,maxi,maxi2,y,conex,x1,x2,y2,lin,col,t1,mij,ok,sol;
int a[1002][1002];
int b[1003][1003];
int dx[]={0,-1,0,1};
int dy[]={1,0,-1,0};
char ch;
void lee(int k)
{
lin=c[k].x;
col=c[k].y;
for(j=0;j<=3;j++)
{
if(lin+dx[j] >=1 &&lin+dx[j]<=n && col+dy[j]>=1 && col+dy[j]<=m)
{
if((a[lin+dx[j]][col+dy[j]] == 0))
{
a[lin+dx[j]][col+dy[j]]=a[lin][col]+1;
dr++;
c[dr].x=lin+dx[j];
c[dr].y=col+dy[j];
}
}
}
}
void clean()
{
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
b[i][j]=0;
}
}
}
int verif(int k)
{
int i;
clean();
dr=1;
c[dr].x=x1;
c[dr].y=t1;
b[x1][t1]=1;
for(i=1;i<=dr;i++)
{
lin=c[i].x;
col=c[i].y;
for(j=0;j<=3;j++)
{
if(lin+dx[j] >=1 &&lin+dx[j]<=n && col+dy[j]>=1 && col+dy[j]<=m)
{
if( b[lin+dx[j]][col+dy[j]]==0 && a[lin+dx[j]][col+dy[j]]>=k)
{
b[lin+dx[j]][col+dy[j]]=b[lin][col]+1;
dr++;
c[dr].x=lin+dx[j];
c[dr].y=col+dy[j];
}
}
}
}
if(b[x2][y2]!=0) return 1;
return 0;
}
int main()
{
fin>>n>>m;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
fin>>ch;
if(ch=='.') a[i][j]=0;
if(ch=='D')
{
dr++;
c[dr].x=i;
c[dr].y=j;
a[i][j]=1;
}
if(ch=='*') a[i][j]=-1;
if(ch=='I')
{
x1=i;
t1=j;
}
if(ch=='O')
{
x2=i;
y2=j;
}
}
}
for(i=1;i<=dr;i++)
{
lee(i);
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
a[i][j]--;
}
}
//fout<<x2<<" "<<y2<<"\n";
t=1;
s=m*n/2;
//fout<<verif(25)<<"\n";
while(t<=s)
{
mij=(t+s)/2;
ok=verif(mij);
//fout<<mij<<" "<<ok<<"\n";
//
if(ok==1)
{
sol=mij;
t=mij+1;
}
else
{
s=mij-1;
}
// fout<<ok<<" ";
}
if(sol==0)fout<<"-1";
else
fout<<sol<<"\n";
//fout<<ok<<"\n";
//fout<<verif(4);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
// fout<<a[i][j]<<" ";
}
// fout<<"\n";
}
}