Pagini recente » Cod sursa (job #819394) | Cod sursa (job #391021) | Cod sursa (job #1538478) | Cod sursa (job #2510659) | Cod sursa (job #2067669)
#include <iostream>
#include <fstream>
#include <deque>
#define NMAX 1001
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int i,j,n,m,ok,xout,yout,xi,yi,xf,yf,xc,yc,xin,yin,mij;
int v[NMAX][NMAX],v2[NMAX][NMAX];
int dx[]={0, 0, 0, 1, -1};
int dy[]={0, 1, -1, 0, 0};
int Interior(int a,int b)
{
if(a<=n && a>=1 && b<=m && b>=1) return 1;
return 0;
}
deque <pair<int ,int> > q;
pair <int ,int> aux;
char a;
int main()
{
fin >> n >> m;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
fin >> a;
if(a=='*') /// Perete
v[i][j]=-1;
if(a=='D') /// Dragon
{
q.push_back(make_pair(i,j));
v[i][j]=1;
}
if(a=='I')
{
xin=i; /// coordonate de intrare (al lui Paftenie)
yin=j;
}
if(a=='O')
{
xout=i; /// coordonate de iesire din pivnita
yout=j;
}
}
}
while(!q.empty())
{
aux=q.front();
q.pop_front();
for(i=1;i<=4;i++)
{
if(v[aux.first+dx[i]][aux.second+dy[i]]==0 and Interior(aux.first+dx[i],aux.second+dy[i])==1)
{
v[aux.first+dx[i]][aux.second+dy[i]]=v[aux.first][aux.second]+1;
aux.first=aux.first+dx[i];
aux.second=aux.second+dy[i];
q.push_back(aux); /// c.push_back(make_pair(aux.first,aux.second)); ????
}
}
}
/// PARTEA CU CAUTAREA BINARA ============>>
int st=1,dr=max(n,m);
int ok=1,ok2;
while(st<=dr)
{
mij=(st+dr)/2;
aux.first=xin;
aux.second=yin;
while(!q.empty()) q.pop_front();
if(mij>v[xin][yin]) /// v[xin][yin] e cea mai aporpiata distanta de un dragon
{
dr=mij-1;
continue;
}
v2[xin][yin]=mij;
q.push_back(make_pair(aux.first,aux.second)); /// q.push_back(make_pair(aux.first,aux.second)) ?
ok2=0;
while(!q.empty() and ok2==0)
{
aux=q.front();
q.pop_front();
for(i=1;i<=4;i++)
{
if(v[aux.first+dx[i]][aux.second+dy[i]]>=mij and Interior(aux.first+dx[i],aux.second+dy[i]) and v2[aux.first+dx[i]][aux.second+dy[i]]!=mij)
{
v2[aux.first+dx[i]][aux.second+dy[i]]=mij;
aux.first=aux.first+dx[i];
aux.second=aux.second+dy[i];
q.push_back(aux); /// q.push_back(make_pair( .....)) ?
if(aux.first==xout and aux.second==yout)
ok2=1;/// daca se afla la iesirea din temnita (s-a terminat drumul)
}
}
}
if(ok2==1) /// daca s-a iesit din temnita
st=mij+1;
else dr=mij-1;
}
if(dr-1>=0) fout << dr-1;
else fout << -1;
return 0;
}