Pagini recente » Cod sursa (job #432410) | Cod sursa (job #589122) | Cod sursa (job #491022) | Cod sursa (job #170923) | Cod sursa (job #2293017)
#include <fstream>
#include <queue>
#define NMAX 1000
using namespace std;
ifstream fi("barbar.in");
ofstream fo("barbar.out");
char C[NMAX+5][NMAX+5];
int n, m, lstart, cstart, lfinish, cfinish;
int dl[]={-1, 0, 1, 0}, dc[]={0, 1, 0, -1};
int dstDragon[NMAX+5][NMAX+5], DST[NMAX+5][NMAX+5], VIZ[NMAX+5][NMAX+5];
queue <pair <int, int> > Q;
void citire(void)
{
fi>>n>>m;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
fi>>C[i][j];
if(C[i][j]=='D')
{
Q.push({i, j});
VIZ[i][j]=1;
}
if(C[i][j]=='I')
{
lstart=i;
cstart=j;
}
if(C[i][j]=='O')
{
lfinish=i;
cfinish=j;
}
}
}
bool accesibil(int lin, int col)
{
if(VIZ[lin][col] || C[lin][col]=='*' || lin<1 || lin>n || col<1 || col>m)
return 0;
return 1;
}
void leeDragoni(void)
{
int lin, col, lnou, cnou;
while(!Q.empty())
{
lin=Q.front().first;
col=Q.front().second;
Q.pop();
for(int d=0; d<4; d++)
{
lnou=lin+dl[d];
cnou=col+dc[d];
if(accesibil(lnou, cnou))
{
dstDragon[lnou][cnou]=dstDragon[lin][col]+1;
VIZ[lnou][cnou]=1;
Q.push({lnou, cnou});
}
}
}
}
int lee(int distMax)
{
int lin, col, lnou, cnou;
while(!Q.empty())
Q.pop();
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
VIZ[i][j]=DST[i][j]=0;
Q.push({lstart, cstart});
while(!Q.empty())
{
lin=Q.front().first;
col=Q.front().second;
Q.pop();
for(int d=0; d<4; d++)
{
lnou=lin+dl[d];
cnou=col+dc[d];
if(accesibil(lnou, cnou) && dstDragon[lnou][cnou]>=distMax)
{
DST[lnou][cnou]=DST[lin][col]+1;
VIZ[lnou][cnou]=1;
Q.push({lnou, cnou});
}
}
}
return VIZ[lfinish][cfinish];
}
int cautBin(void)
{
int lo=0, hi=n*m, mid, res=-1;
while(lo<=hi)
{
mid=lo+(hi-lo)/2;
if(lee(mid)==1)
{
res=mid;
lo=mid+1;
}
else
hi=mid-1;
}
return res;
}
int main()
{
citire();
leeDragoni();
fo<<cautBin();
fi.close();
fo.close();
return 0;
}