Pagini recente » Cod sursa (job #1877751) | Cod sursa (job #572571) | Cod sursa (job #84898) | Cod sursa (job #123968) | Cod sursa (job #2306031)
#include <fstream>
#include <queue>
#include <string>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int NMAX=1000;
int n, m, l;
int matrix[NMAX+5][NMAX+5];
bool viz[NMAX+5][NMAX+5];
int dx[4]={1, 0, -1, 0};
int dy[4]={0, 1, 0, -1};
string s;
struct point
{
int linie, coloana;
};
//-1 dragon, 1-de unde pleaca barbarul,, -2 -perete
queue <point>q, q2;
int dragoni[NMAX+5][NMAX+5];
void BFS()
{
int i, j;
point a, b;
while(!q.empty())
{
a=q.front();
q.pop();
for(i=0;i<4;i++)
{
b.linie=a.linie+dy[i];
b.coloana=a.coloana+dx[i];
if(b.linie>0 and b.linie<=n and b.coloana>0 and b.coloana<=m and dragoni[b.linie][b.coloana]==0)
{
dragoni[b.linie][b.coloana]=dragoni[a.linie][a.coloana]+1;
q.push(b);
}
}
}
}
void BFS2()
{
int i, j;
point a, b;
while(!q2.empty())
{
a=q2.front();
q2.pop();
q.push(a);
}
while(!q.empty())
{
a=q.front();
q.pop();
for(i=0;i<4;i++)
{
b.linie=a.linie+dy[i];
b.coloana=a.coloana+dx[i];
if(b.linie>0 and b.linie<=n and b.coloana>0 and b.coloana<=m and matrix[b.linie][b.coloana]==0 and viz[b.linie][b.coloana]==0)
{
if(dragoni[b.linie][b.coloana]>l)
{
viz[b.linie][b.coloana]=1;
q.push(b);
}
else
q2.push(a);
}
}
}
}
int main()
{
int i, j;
point a, st, f;
fin>>n>>m;
fin.get();
for(i=1;i<=n;i++)
{
getline(fin, s);
for(j=0;j<s.size();j++)
{
if(s[j]=='*')
{
matrix[i][j+1]=-2;
dragoni[i][j+1]=-2;
}
else
{
if(s[j]=='D')
{
matrix[i][j+1]=-1;
dragoni[i][j+1]=1;
a.linie=i;
a.coloana=j+1;
q.push(a);
}
else
{
if(s[j]=='I')
{
st.coloana=j+1;
st.linie=i;
viz[st.linie][st.coloana]=1;
}
else
{
if(s[j]=='O')
{
f.coloana=j+1;
f.linie=i;
}
}
}
}
}
}
BFS();
q2.push(st);
l=dragoni[st.linie][st.coloana]-1;
while(l>0)
{
BFS2();
if(viz[f.linie][f.coloana]!=0)
{
fout<<l<<"\n";
return 0;
}
l--;
}
fout<<"-1"<<"\n";
return 0;
}