Pagini recente » Cod sursa (job #483279) | Cod sursa (job #297036) | Cod sursa (job #6470) | Cod sursa (job #1045398) | Cod sursa (job #874559)
Cod sursa(job #874559)
#include <fstream>
#include <iostream>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
const int g[]={0,0,1,-1};
const int h[]={1,-1,0,0};
int n,m,k,l,i,j,x1,x2,y1,y2,a[1002][1002],b[1000002],c[1000002],minim,maxim,z,p;
int d[1002][1002];
char s;
bool verif(int u)
{
for (i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
d[i][j]=-1;
}
d[x1][x2]=1; l=1; k=1; b[1]=x1; c[1]=x2;
while(l<=k)
{
for(i=0;i<4;i++)
{
if(d[b[l]+g[i]][c[l]+h[i]]==-1&&a[b[l]+g[i]][c[l]+h[i]]>=u)
{
k++;
d[b[l]+g[i]][c[l]+h[i]]=d[b[l]][c[l]]+1;
b[k]=b[l]+g[i]; c[k]=c[l]+h[i];
}
}
l++;
}
if(d[y1][y2]!=-1) return true;
return false;
}
void bin(int st, int dr)
{
if(st>=dr) return;
int z=(st+dr)/2;
if(verif(z)==true)
{
if(z>maxim) maxim=z;
bin(z+1,dr);
}
else bin(1,z-1);
return;
}
int main()
{
in>>n>>m>>ws;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
in>>s;
if(s=='.') a[i][j]=-1;
if(s=='D')
{
a[i][j]=0;
k++;
b[k]=i; c[k]=j;
}
if(s=='*') a[i][j]=-2;
if(s=='I')
{
a[i][j]=-1;
x1=i; x2=j;
}
if(s=='O')
{
a[i][j]=-1;
y1=i; y2=j;
}
cout<<a[i][j]<<" ";
}
cout<<"\n";
}
l=1;
while(l<=k)
{
for (i=0;i<4;i++)
{
if(a[b[l]+g[i]][c[l]+h[i]]==-1)
{
a[b[l]+g[i]][c[l]+h[i]]=a[b[l]][c[l]]+1;
k++;
b[k]=b[l]+g[i]; c[k]=c[l]+h[i];
}
}
l++;
}
minim=a[x1][x2]; maxim=0;
if(minim>a[y1][y2]) minim=a[y1][y2];
bin(1,minim);
out<<maxim;
return 0;
}