Pagini recente » Istoria paginii utilizator/deque | Cod sursa (job #2473615) | Cod sursa (job #1025121)
#include<iostream>
#include<fstream>
using namespace std;
int dx[]={0,0,-1,1};
int dy[]={-1,1,0,0};
int r,c, sx, sy, fx, fy;
char a[1000][1000];
int b[1000][1000], d[1000][1000];
void BF(int x, int y)
{
int k;
for( k = 0; k <= 3 ; k ++)
{
if((b[x+dx[k]][y+dy[k]]>0) && (b[x+dx[k]][y+dy[k]]>b[x][y]+1) && x+dx[k]<r && y+dy[k]<c && x+dx[k]>=0 &&y+dy[k]>=0)
{
if(b[x][y]==-2)
b[x+dx[k]][y+dy[k]]=1;
else
b[x+dx[k]][y+dy[k]]=b[x][y]+1;
BF(x+dx[k],y+dy[k]);
}
}
}
void BFF(int x, int y)
{
int k;
for(k=0; k <=3; k++)
{
if((d[x+dx[k]][y+dy[k]]>0)&& d[x][y]>d[x+dx[k]][y+dy[k]] && x+dx[k]<r && y+dy[k]<c && x+dx[k]>=0 &&y+dy[k]>=0)
{
int t=min(b[x+dx[k]][y+dy[k]], d[x][y]);
t=max(t, d[x+dx[k]][y+dy[k]]);
d[x+dx[k]][y+dy[k]]=t;
BFF(x+dx[k], y+dy[k]);
}
}
}
int main()
{
ifstream f("barbar.in");
ofstream g("barbar.out");
int i, j;
f>>r>>c;
for(i = 0; i < r; i++)
for(j = 0; j < c; j ++)
{
f>>a[i][j];
if(a[i][j]=='*')
b[i][j]=-1;
if(a[i][j]=='.')
b[i][j]=100000;
if(a[i][j]=='D')
b[i][j]=-2;
if(a[i][j]=='I')
sx=i, sy=j, b[i][j]=100000;
if(a[i][j]=='O')
fx=i, fy=j, b[i][j]=100000;
}
for(i=0; i<r; i++)
for(j=0; j<c; j++)
if(b[i][j] == -2)
BF(i, j);
for(i=0;i<r;i++)
for(j=0;j<c;j++)
d[i][j]=1;
d[sx][sy]=b[sx][sy];
BFF(sx,sy);
g<<d[fx][fy];
}