Pagini recente » Cod sursa (job #2732942) | Cod sursa (job #170531) | Cod sursa (job #1925376) | Cod sursa (job #2967944) | Cod sursa (job #2303609)
#include <fstream>
#include <queue>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
pair<int,int>w[5],O,I;
queue<pair<int,int> >coada;
char a[1005][1005];
long d[1005][1005];
bool viz[1005][1005],ok;
int n,m;
void citire()
{
f>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
f>>a[i][j];
d[i][j]=-1;
if(a[i][j]=='D')
{
coada.push(make_pair(i,j));
d[i][j]=0;
}
if(a[i][j]=='*')
d[i][j]=-2;
if(a[i][j]=='I')
I=make_pair(i,j);
if(a[i][j]=='O')
O=make_pair(i,j);
}
}
void lee(int x)
{
w[1]=make_pair(1,0);
w[2]=make_pair(-1,0);
w[3]=make_pair(0,1);
w[4]=make_pair(0,-1);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
viz[i][j]=0;
while(!coada.empty())
{
int linie=coada.front().first;
int coloana=coada.front().second;
for(int i=1;i<=4;i++)
{
if(x==-1 && d[linie+w[i].first][coloana+w[i].second]==-1)
{
d[linie+w[i].first][coloana+w[i].second]=d[linie][coloana]+1;
coada.push(make_pair(linie+w[i].first,coloana+w[i].second));
}
if(x!=-1 && d[linie+w[i].first][coloana+w[i].second]>=x && viz[linie+w[i].first][coloana+w[i].second]==0)
{
if(linie+w[i].first==O.first && coloana+w[i].second==O.second){ok=1;return;}
viz[linie+w[i].first][coloana+w[i].second]=1;
coada.push(make_pair(linie+w[i].first,coloana+w[i].second));
}
}
coada.pop();
}
}
long cbinara(long st,long dr)
{
long tok=-1;
long t;
while(st<=dr)
{
t=(st+dr)/2;
ok=0;
while(!coada.empty())coada.pop();
coada.push(I);
lee(t);
if(ok==0)dr=t-1;
else
{
tok=t;
st=t+1;
}
}
return tok;
}
int main()
{citire();
lee(-1);
g<<cbinara(0,min(d[I.first][I.second],d[O.first][O.second]));
return 0;
}