Pagini recente » Cod sursa (job #2514339) | Cod sursa (job #431887) | Cod sursa (job #832560) | Cod sursa (job #1560597) | Cod sursa (job #170329)
Cod sursa(job #170329)
#include<fstream>
fstream f,g;
char s[2];
int b[1001][1001],a[1001][1001],dx[10001],dy[10001],ix,iy,ex,ey,k1,k2,dx2[10001],dy2[10001];
long maxxx,l,h,ok,mij,maxx,n,i,m,c,j;
//functie afisare
void af(int a[101][101])
{
int i,j;
cout<<endl;
for(i=0;i<=n+1;i++)
{
for(j=0;j<=m+1;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
}
//functie gasire drum
void fill(int k,int pozx,int pozy)
{
if((b[pozx][pozy]==0)&&(a[pozx][pozy]>=k))
{
b[pozx][pozy]=1;
fill(k,pozx-1,pozy);
fill(k,pozx+1,pozy);
fill(k,pozx,pozy-1);
fill(k,pozx,pozy+1);
}
}
//functie b=0
void zero()
{
int i,j;
for(i=0;i<=n+1;i++)
for(j=0;j<=m+1;j++)
b[i][j]=0;
}
using namespate std;
int main()
{
f.open("barbar.in",ios::in);
g.open("barbar.out",ios::out);
f>>n>>m;
f.get();
c=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
f.get(s,2,'\n');
if(s[0]=='*')
a[i][j]=0;
if(s[0]=='.')
a[i][j]=10000;
if(s[0]=='D')
{
a[i][j]=0;
c++;
dx[c]=i; //x dragon
dy[c]=j; //y dragon
}
if(s[0]=='I')
{
a[i][j]=0;
ix=i; //x intrare
iy=j; //y intrare
}
if(s[0]=='O')
{
a[i][j]=0;
ex=i; //x iesire
ey=j; //y iesire
}
}
f.get();
}
for(i=0;i<=n+1;i++)
{
a[i][0]=0;
a[i][m+1]=0;
}
for(i=0;i<=m;i++)
{
a[0][i]=0;
a[n+1][i]=0;
}
k1=c;
c=0;
while(k1!=0)
{
c++;
k2=0;
for(i=1;i<=k1;i++)
{
//i-1
if((a[dx[i]-1][dy[i]]>0)&&(c<a[dx[i]-1][dy[i]]))
{
a[dx[i]-1][dy[i]]=c;
k2++;
dx2[k2]=dx[i]-1;
dy2[k2]=dy[i];
}
//i+1
if((a[dx[i]+1][dy[i]]>0)&&(c<a[dx[i]+1][dy[i]]))
{
a[dx[i]+1][dy[i]]=c;
k2++;
dx2[k2]=dx[i]+1;
dy2[k2]=dy[i];
}
//j-1
if((a[dx[i]][dy[i]-1]>0)&&(c<a[dx[i]][dy[i]-1]))
{
a[dx[i]][dy[i]-1]=c;
k2++;
dx2[k2]=dx[i];
dy2[k2]=dy[i]-1;
}
//j+1
if((a[dx[i]][dy[i]+1]>0)&&(c<a[dx[i]][dy[i]+1]))
{
a[dx[i]][dy[i]+1]=c;
k2++;
dx2[k2]=dx[i];
dy2[k2]=dy[i]+1;
}
}
k1=k2;
for(i=1;i<=k2;i++)
{
dx[i]=dx2[i];
dy[i]=dy2[i];
}
}
maxx=0;
if(a[ix-1][iy]>maxx)
maxx=a[ix-1][iy];
if(a[ix+1][iy]>maxx)
maxx=a[ix+1][iy];
if(a[ix][iy-1]>maxx)
maxx=a[ix][iy-1];
if(a[ix][iy+1]>maxx)
maxx=a[ix][iy+1];
maxxx=0;
if(a[ex-1][ey]>maxxx)
maxxx=a[ex-1][ey];
if(a[ex+1][ey]>maxxx)
maxxx=a[ex+1][ey];
if(a[ex][ey-1]>maxxx)
maxxx=a[ex][ey-1];
if(a[ex][ey+1]>maxxx)
maxxx=a[ex][ey+1];
if(maxx>maxxx)
maxx=maxxx;
//af(a);
l=1;
h=maxx;
ok=-1;
a[ix][iy]=maxx;
a[ex][ey]=maxx;
while(l<=h)
{
mij=(l+h)/2;
zero();
fill(mij,ix,iy);
if(b[ex][ey]==1)
{
ok=mij;
l=mij+1;
}
else
{
h=mij-1;
}
}
g<<ok;
f.close();
g.close();
return 0;
}