Pagini recente » Cod sursa (job #69168) | Cod sursa (job #399879) | Cod sursa (job #2214708) | Cod sursa (job #2420616) | Cod sursa (job #3203920)
#include <fstream>
#include <queue>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
const int nmax=1001;
int n, m, xs, ys, xf, yf;
char a[nmax+1][nmax+1];
int drag[nmax+1][nmax+1];
int ox[]={-1, 1, 0, 0};
int oy[]={0, 0, -1, 1};
queue <pair<int, int>> q;
bool InMatrix(int x, int y)
{
return (x>=1 && x<=n && y>=1 && y<=m);
}
void LeeDragoni()//pt fiecare casuta stiu distanta minima pana la un dragon
{
int x1, y1, x2, y2;
while(!q.empty())
{
x1=q.front().first; y1=q.front().second;
q.pop();
for(int dir=0; dir<=3; dir++)
{
x2=x1+ox[dir]; y2=y1+oy[dir];
if(InMatrix(x2, y2) && a[x2][y2]!='*' && a[x2][y2]!='D' && (drag[x2][y2]>drag[x1][y1]+1 || drag[x2][y2]==0))
{
drag[x2][y2]=drag[x1][y1]+1;
q.push({x2, y2});
}
}
}
}
bool LeeAjunge(int dmax)//sa nu se apropie de dragoni decat cu maxim dmax
{
bool aj[nmax+1][nmax+1]={};
while(!q.empty()) q.pop();
q.push({xs, ys});
aj[xs][ys]=1;
int x1, y1, x2, y2;
while(!q.empty())
{
x1=q.front().first; y1=q.front().second;
q.pop();
for(int dir=0; dir<=3; dir++)
{
x2=x1+ox[dir]; y2=y1+oy[dir];
if(InMatrix(x2, y2) && (a[x2][y2]!='*') && aj[x2][y2]==0 && drag[x2][y2]>=dmax)
{
aj[x2][y2]=1;
if(x2==xf && y2==yf)
return 1;
q.push({x2, y2});
}
}
}
// for(int i=1; i<=n; i++)
// {
// for(int j=1; j<=m; j++)
// {
// out<<aj[i][j]<<" ";
// }
// out<<'\n';
// }
return 0;
}
int main()
{
in>>n>>m;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
in>>a[i][j];
if(a[i][j]=='D')
{
q.push({i, j});
}
if(a[i][j]=='I')
{
xs=i; ys=j;
}
if(a[i][j]=='O')
{
xf=i; yf=j;
}
}
}
LeeDragoni();
// for(int i=1; i<=n; i++)
// {
// for(int j=1; j<=n; j++)
// {
// out<<drag[i][j]<<" ";
// }
// out<<'\n';
// }
int rez=0;
int st=0, dr=n+m, mijl;//cautare binara pe raspuns
//out<<LeeAjunge(1); return 0;
bool poate;
while(st<=dr)
{
mijl=(st+dr)/2;
poate=LeeAjunge(mijl);//poate ajunge la destinatie fiind departe de dragoni cu mijl
//out<<mijl<<" "<<poate<<"\n";
if(poate==1)
{
rez=mijl;
st=mijl+1;
}
else
{
dr=mijl-1;
}
}
if(LeeAjunge(0)==1)
out<<rez;
else
out<<"-1";
}