Pagini recente » Cod sursa (job #459805) | Cod sursa (job #101791) | Cod sursa (job #829810) | Cod sursa (job #2446264) | Cod sursa (job #3237895)
#include <iostream>
#include <fstream>
#include <queue>
#include <iomanip>
#define len 1003 //valoarea nu va merge aici
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int r,c,psi,psj,pfi,pfj,v[len][len],max1=-10;
//pt vizitare vecini
int di[4]= {0,0,1,-1};
int dj[4]= {-1,1,0,0}; //st dr sus jos
queue<pair<int,int>> q;
int verificare(int i,int j)
{
if(i<1 || i>r || j<1 && j>c)
return 0;
if(v[i][j]==-1)
return 0;
return 1;
}
void Lee()
{
for(int i=0; i<=r+1; i++)
for(int j=0; j<=c+1; j++)
{
if(v[i][j]!=0 && v[i][j]!=-1) //diferit de dragoni si e perete
{
v[i][j]=1e7;
}
}
while(q.size()>0)
{
int lin=q.front().first;
int col=q.front().second;
q.pop();
if(v[lin][col]>max1)
{
max1=v[lin][col];
}
for(int i=0; i<4; i++)
{
int nlin=lin+di[i];
int ncol=col+dj[i];
if(verificare(nlin,ncol) && v[lin][col]+1<v[nlin][ncol] )
{
v[nlin][ncol]=v[lin][col]+1;
q.push( make_pair(nlin,ncol) );
}
}
}
}
int Lee2(int nr)
{
int viz[len][len];
for(int i=0; i<=r+1; i++)
for(int j=0; j<=c+1; j++)
{
viz[i][j]=0;
}
q.push(make_pair(psi,psj)); //pct de start
while(q.size()>0)
{
int lin=q.front().first;
int col=q.front().second;
q.pop();
viz[lin][col]=1;
for(int i=0; i<4; i++)
{
int nlin=lin+di[i];
int ncol=col+dj[i];
if(verificare(nlin,ncol) && v[nlin][ncol]>=nr && viz[nlin][ncol]==0)
{
viz[nlin][ncol]=1;
q.push( make_pair(nlin,ncol) );
}
}
}
if(viz[pfi][pfj]==0)
{
return 0;
}
else return 1;
}
int main()
{
char x;
fin>>r>>c;
for(int i=1; i<=r; i++)
for(int j=1; j<=c; j++)
{
fin>>x;
if(x=='.') //celula libera
v[i][j]=1;
if(x=='*') //perete
v[i][j]=-1;
if(x=='D') //pct dargoni
{
v[i][j]=0;
q.push(make_pair(i,j));
}
if(x=='I') //pct start
{
v[i][j]=-2;
psi=i;
psj=j;
}
if(x=='O') //pct iesire
{
v[i][j]=-2;
pfi=i;
pfj=j;
}
}
Lee();
int last=-1;
for(int i=0;i<=max1;i++)
{
if(Lee2(i))
{
last=i;
}
}
fout<<last;
return 0;
}