Pagini recente » Cod sursa (job #2234992) | Cod sursa (job #1615643) | Cod sursa (job #92529) | Cod sursa (job #2565766) | Cod sursa (job #1192649)
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
#define NMAX 1001
char S[NMAX];
int HM[NMAX][NMAX],M[NMAX][NMAX];
int A,SN,SM,step,sol,i;
vector < pair < int , int > > D;
queue < pair < int , int > > Q,HD;
pair < int , int > Start,Finish;
const int Dx[]={0,0,0,-1,1};
const int Dy[]={0,-1,1,0,0};
int modul (int x)
{
if (x<0) return -x;
return x;
}
bool Good(pair < int , int > P)
{
if (P.first < 1 || P.first > SN || P.second < 1 || P.second > SM) return false;
if (HM[P.first][P.second]!=0) return false;
return true;
}
void Read()
{
int i,j;
scanf("%d%d\n",&SN,&SM);
A=max(SN,SM);
for (i=1;i<=SN;++i)
{
scanf("%s\n",&S);
for (j=SM;j>=1;j--)
switch (S[j-1])
{
case 'D' : M[i][j]=-1 , D.push_back(make_pair(i,j));
break;
case '*' : M[i][j]=-1;
break;
case 'I' : Start=make_pair(i,j);
break;
case 'O' : Finish=make_pair(i,j);
break;
}
}
}
bool Test(int x)
{
int i,j;
vector < pair < int , int > > :: iterator it;
pair < int , int > Help,Now;
for (i=1;i<=SN;++i)
for (j=1;j<=SM;++j)
HM[i][j]=M[i][j];
for (it=D.begin();it!=D.end();++it) HD.push(*it);
while (!HD.empty())
{
Now=HD.front();
HD.pop();
if (modul(HM[Now.first][Now.second])==x) continue;
for (i=1;i<=4;++i)
{
Help=Now;
Help.first+=Dx[i];
Help.second+=Dy[i];
if (!Good(Help)) continue;
HM[Help.first][Help.second]=HM[Now.first][Now.second]-1;
HD.push(Help);
}
}
if (HM[Start.first][Start.second]!=0) return false;
HM[Start.first][Start.second]=1;
while (!Q.empty()) Q.pop();
Q.push(Start);
while (!Q.empty())
{
Now=Q.front();
Q.pop();
for (i=1;i<=4;++i)
{
Help=Now;
Help.first+=Dx[i];
Help.second+=Dy[i];
if (!Good(Help)) continue;
HM[Help.first][Help.second]=HM[Now.first][Now.second];
Q.push(Help);
if (Help==Finish) return true;
}
}
return false;
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
Read();
for (step=1; (step<<1)<=A; step<<=1);
for (i=0; step; step>>=1)
{
if (i+step>A) continue;
if (!Test(i+step)) continue;
i+=step;
sol=i;
}
printf("%d\n",sol);
return 0;
}