Pagini recente » Cod sursa (job #3276121) | Cod sursa (job #619296) | Cod sursa (job #1203184) | Cod sursa (job #2123667) | Cod sursa (job #447133)
Cod sursa(job #447133)
# include <fstream>
# include <queue>
# include <algorithm>
# include <iostream>
# define max MAX
using namespace std;
struct nod{
int i, j;
nod(){}
nod(int I, int J){
i=I;j=J;}
};
int n, m, a[1003][1003], d[1003][1003], sol=-1, max;
int ist, jst, ifin, jfin, di[4]={0, 0, 1, -1}, dj[4]={-1, 1, 0, 0};
queue<nod>Q;
int in_m(int i, int j)
{
if (i && j && i<=n && j<=m)return 1;
return 0;
}
void lee ()
{
int i, j, ii, jj;
nod kk;
while(Q.size())
{
kk=Q.front();
Q.pop();
i=kk.i;j=kk.j;
for(int k=0;k<4;++k)
{
ii=i+di[k];
jj=j+dj[k];
if (a[ii][jj]==0 && in_m(ii, jj) && d[i][j]+1<d[ii][jj])
{
d[ii][jj]=d[i][j]+1;
if (d[ii][jj]>max)max=d[ii][jj];
Q.push(nod(ii, jj));
}
}
}
}
int bun (int w)
{
nod kk;
int i, j, ii, jj;
a[ist][jst]=w;
if (d[ist][jst]<w)return 0;
Q.push(nod(ist, jst));
while (Q.size())
{
kk=Q.front();
i=kk.i;j=kk.j;
Q.pop();
for(int k=0;k<4;++k)
{
ii=i+di[k];
jj=j+dj[k];
if (in_m(ii, jj) && d[ii][jj]>=w && a[ii][jj]!=w && a[ii][jj]>=0)
{
Q.push(nod(ii, jj));
if (ii==ifin && jj==jfin)return 1;
a[ii][jj]=w;
}
}
}
return 0;
}
void cauta (int st, int dr)
{
if (st==dr)
{
if (st<sol && bun(st))
sol=st;
return;
}
int m=(st+dr)/2;
if (bun(m))
{
if (m>sol)sol=m;
cauta(m+1, dr);
}
else
cauta(st, m);
}
int main ()
{
ifstream fin ("barbar.in");
ofstream fout ("barbar.out");
fin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
d[i][j]=1000000000;
char cc;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
fin>>cc;
if (cc=='*')a[i][j]=-1;
if (cc=='D')
{
a[i][j]=-2;
d[i][j]=0;
Q.push(nod(i, j));
}
else
{
if (cc=='I'){ist=i;jst=j;}
else if (cc=='O'){ifin=i;jfin=j;}
}
}
lee();
cauta(1, 10000);
fout<<sol;
return 0;
}