Pagini recente » Cod sursa (job #2236144) | Cod sursa (job #855112) | Cod sursa (job #1230537) | Cod sursa (job #1016546) | Cod sursa (job #2140450)
#include <fstream>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
int n,x,i,j;
const int N=1000;
struct poz
{
int l,c;
};
const int dc[]= {0,1,0,-1},dl[]= {1,0,-1,0};
int d[N+5][N+5],m[N+5][N+5];
poz q[N*N+5],x0,y0;
int p,u;
int lin,col,finlin,fincol;
bool verif(int k)
{
p=0;
u=-1;
q[++u].l=lin;
q[u].c=col;
for(i=1; i<=n; i++)
for(j=1; j<=x; j++)
m[i][j]=-1;
m[lin][col]=0;
while(p<=u)
{
x0=q[p];
for(i=0; i<4; i++)
{
y0.l=x0.l+dl[i];
y0.c=x0.c+dc[i];
if(m[y0.l][y0.c]==-1&&d[y0.l][y0.c]>=k)
{
m[y0.l][y0.c]=m[x0.l][x0.c]+1;
q[++u]=y0;
}
}
p++;
}
if(m[finlin][fincol]!=-1)
return 1;
return 0;
}
void cautbin()
{
int rez=0,pas=1<<10;
while(pas)
{
if(rez+pas<=min(d[lin][col],d[finlin][fincol])&&verif(rez+pas)==1)
rez+=pas;
pas/=2;
}
out<<rez;
}
int main()
{
char c1;
u=-1;
in>>n>>x>>ws;
for(i=1; i<=x; i++)
d[0][i]=d[n+1][i]=1;
for(i=1;i<=n;i++)
d[i][0]=d[i][x+1]=1;
for(i=1; i<=n; i++)
{
for(j=1; j<=x; j++)
{
in>>c1;
if(c1=='.')
d[i][j]=-1;
else if(c1=='D')
{
q[++u].l=i;
q[u].c=j;
}
else if(c1=='I')
{
lin=i;
col=j;
d[i][j]=-1;
}
else if(c1=='O')
{
finlin=i;
fincol=j;
d[i][j]=-1;
}
else
d[i][j]=-2;
}
in>>ws;
}
while(p<=u)
{
x0=q[p];
for(i=0; i<4; i++)
{
y0.l=x0.l+dl[i];
y0.c=x0.c+dc[i];
if(d[y0.l][y0.c]==-1)
{
d[y0.l][y0.c]=d[x0.l][x0.c]+1;
q[++u]=y0;
}
}
p++;
}
/*for(i=1;i<=n;i++){
for(j=1;j<=x;j++)
out<<d[i][j]<<" ";
out<<'\n';}*/
cautbin();
return 0;
}