Nu aveti permisiuni pentru a descarca fisierul grader_test5.in
Cod sursa(job #174946)
Utilizator | Data | 9 aprilie 2008 13:32:43 | |
---|---|---|---|
Problema | Barbar | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 2.56 kb |
#include<fstream>
using namespace std;
fstream f,g;
char s[2];
long b[1001][1001],a[1001][1001],dx[100001],dy[100001],ix,iy,ex,ey,k1,k2,dx2[100001],dy2[100001];
long maxxx,l,h,ok,mij,maxx,n,i,m,c,j;
//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;
}
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;
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;
}