Pagini recente » Cod sursa (job #3133339) | Cod sursa (job #2358537) | Cod sursa (job #1675037) | Cod sursa (job #315988) | Cod sursa (job #2537611)
#include <iostream>
#include<fstream>
#include<cstring>
#include<algorithm>
#define N 1005
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int a[N][N],n,m;
int b[N][N];//pt dist minime
int x1,y1,x2,y2;//pct de plecare
int l[N*N],c[N*N],ult;//pt dragoni
int dl[]={-1,1,0,0};
int dc[]={0,0,1,-1};
void read()
{
int i,j;
char x;
fin>>n>>m;
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
{
fin>>x;
if(x=='I')x1=i,y1=j;
if(x=='O')x2=i,y2=j;
if(x=='*')a[i][j]=-1;
if(x=='D')l[++ult]=i,c[ult]=j,a[i][j]=-1,b[i][j]=1;
}
}
bool inmatrice(int l,int c)
{
return l>=1&&c>=1&&l<=n&&c<=m;
}
void distante()
{
int i,j,lin,col,lv,cv,k;
int pr=1;
while(pr<=ult)
{
lin=l[pr];col=c[pr];pr++;
for(k=0;k<4;++k)
{
lv=lin+dl[k];cv=col+dc[k];
if(a[lv][cv]==0&&b[lv][cv]==0&&inmatrice(lv,cv))
{
b[lv][cv]=b[lin][col]+1;
l[++ult]=lv;c[ult]=cv;
}
}
}
}
bool posibil(int dist)
{
//aplicam lee de la x1,y1,la x2,y2
int pr=1,ult=0;
int lin,col,k,lv,cv;
a[x1][y1]=1;
l[++ult]=x1;c[ult]=y1;
while(pr<=ult&&a[x2][y2]==0)
{
lin=l[pr];col=c[pr];pr++;
for(k=0;k<4;++k)
{
lv=lin+dl[k];cv=col+dc[k];
if(a[lv][cv]==0&&inmatrice(lv,cv)&&b[lv][cv]>=dist)
{
a[lv][cv]=a[lin][col]+1;
l[++ult]=lv;c[ult]=cv;
}
}
}
if(a[x2][y2]!=0)return true;
return false;
}
void reinitializare()
{
int i,j;
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
if(a[i][j]!=-1)a[i][j]=0;
}
void solve()
{
//cautam binar distanta de la 1 la min(n,m)
int s=1,d=min(n,m);
int sol;
while(s<=d)
{
int mij=(s+d)/2;
if(posibil(mij)==true)
{
sol=mij;
s=mij+1;//incercam una mai buna
reinitializare();
}
else
d=mij-1;
}
fout<<sol-1;
}
int main()
{
int i,j;
read();
distante();
//cout<<x2<<" "<<y2;
//posibil(1);
solve();
/*for(i=1;i<=n;++i)
{
for(j=1;j<=m;++j)cout<<a[i][j]<<" ";
cout<<"\n";
}*/
return 0;
}