Pagini recente » Cod sursa (job #3269329) | Cod sursa (job #213254) | Cod sursa (job #412201) | Cod sursa (job #398662)
Cod sursa(job #398662)
#include<fstream>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
char c;
int a[1013][1013],d[1012][1012],n,m,i,j,xx1,xx2,yy1,yy2,k=0,aa[]={-1,1,0,0},bb[]={0,0,-1,1},cx,cy;
struct punct
{
int x,y;
};
punct p[251000];
void add(int c1, int c2)
{
k++;
p[k].x=c1;
p[k].y=c2;
}
void bordare()
{
for(i=1;i<=n;i++)
{a[i][0]=d[i][0]=-1;a[i][m+1]=d[i][m+1]=-1;}
for(i=1;i<=m;i++)
{a[0][i]=d[0][i]=-1;a[n+1][i]=d[n+1][i]=-1;}
}
void init()
{
for(i=1;i<=251000;i++)
p[i].x=p[i].y=0;
}
int main()
{
f>>n>>m;
for(i=1;i<=n;i++)
{
f.get(c);
for(j=1;j<=n;j++)
{
f.get(c);
switch(c)
{
case 'I': xx1=i;yy1=j;a[i][j]=1;break;
case 'D': d[i][j]=1;add(i,j);break;
case 'O': xx2=i;yy2=j;break;
case '*': d[i][j]=a[i][j]=-1;break;
}
}
}
bordare();
for(i=1;p[i].x||p[i].y;i++)
{
for(int ii=0;ii<4;ii++)
{
cx=p[i].x+aa[ii];
cy=p[i].y+bb[ii];
if(!d[cx][cy])
{
d[cx][cy]=d[p[i].x][p[i].y]+1;
add(cx,cy);
}
}
}
k=0;
init();
add(xx1,yy1);
int min=d[xx1][yy1];
bool ok1=true;
for(i=1;ok1;i++)
if(p[i].x||p[i].y)
for(int ii=0;ii<4;ii++)
{
cx=p[i].x+aa[ii];
cy=p[i].y+bb[ii];
if(cx==xx2&&cy==yy2)
ok1=false;
if(!a[cx][cy]&&d[cx][cy]>=min)
{add(cx,cy);a[cx][cy]=1;d[cx][cy]=0;}
}
else
{
i=0;min--;if(min==0) {ok1=false;g<<-1<<endl;}
}
if(min!=0)g<<min-1<<endl;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
g<<d[i][j];
g<<endl;
}
f.close();
g.close();
return 0;
}