Pagini recente » Cod sursa (job #2189117) | Cod sursa (job #738295) | Cod sursa (job #2248576) | Cod sursa (job #3321792) | Cod sursa (job #3348378)
#include <bits/stdc++.h>
using namespace std;
const string NUMEFISIER="barbar";
ifstream fin(NUMEFISIER+".in");
ofstream fout(NUMEFISIER+".out");
const int Nmax=1001;
int n,m;
bool visited[Nmax][Nmax];
int distDragon[Nmax][Nmax];
pair<int, int> startPoint,endPoint;
const int dl[]={-1,0,1,0};
const int dc[]={0,1,0,-1};
void parcurgere(pair<int, int> point, int dist)
{
visited[point.first][point.second]=1;
for(int i=0; i<4; i++)
{
pair<int, int> newPoint=make_pair(point.first+dl[i],point.second+dc[i]);
if(1<=newPoint.first && newPoint.first<=n && 1<=newPoint.second && newPoint.second<=m)
{
if(!visited[newPoint.first][newPoint.second] && distDragon[newPoint.first][newPoint.second]!=-2 && distDragon[newPoint.first][newPoint.second]>=dist)
parcurgere(newPoint, dist);
}
}
}
bool existaDrum(int dist)
{
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
visited[i][j]=0;
parcurgere(startPoint, dist);
return visited[endPoint.first][endPoint.second];
}
int main()
{
fin>>n>>m;
char c;
queue<pair<int, int>> qDragoni;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
fin>>c;
distDragon[i][j]=-1;
switch(c)
{
case '.':
break;
case 'D':
distDragon[i][j]=0;
qDragoni.push(make_pair(i, j));
break;
case '*':
distDragon[i][j]=-2;
break;
case 'I':
startPoint=make_pair(i, j);
break;
case 'O':
endPoint=make_pair(i, j);
break;
}
}
while(!qDragoni.empty())
{
pair<int, int> point=qDragoni.front();
qDragoni.pop();
for(int i=0; i<4; i++)
{
pair<int, int> newPoint=make_pair(point.first+dl[i], point.second+dc[i]);
if(1<=newPoint.first && newPoint.first<=n && 1<=newPoint.second && newPoint.second<=m)
{
if(distDragon[newPoint.first][newPoint.second]==-1)
{
distDragon[newPoint.first][newPoint.second]=1+distDragon[point.first][point.second];
qDragoni.push(newPoint);
}
}
}
}
int st=0,dr=n*m,mij,rez=-1;
while(st<=dr)
{
mij=(st+dr)/2;
if(existaDrum(mij))
{
rez=mij;
st=mij+1;
}
else dr=mij-1;
}
fout<<rez;
return 0;
}