Pagini recente » Cod sursa (job #833588) | Cod sursa (job #2776823) | Cod sursa (job #370542) | Cod sursa (job #1559329) | Cod sursa (job #2296203)
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int n,m,a[1005][1005],maxim;
int dx[]={-1,1,0,0};
int dy[]={0,0,1,-1};
bool b[1005][1005];
queue < pair<int,int> > Coada;
pair <int,int> start,finish;
char x;
int nr;
void BFS()
{
int p,q,i;
while(!Coada.empty())
{
p=Coada.front().first;
q=Coada.front().second;
Coada.pop();
for(i=0;i<4;i++)
{
if(a[p+dx[i]][q+dy[i]]==0)
{
if(a[p][q]==-1)
{
a[p+dx[i]][q+dy[i]]=1;
}
else
{
a[p+dx[i]][q+dy[i]]=a[p][q]+1;
}
if(a[p+dx[i]][q+dy[i]]>maxim)
{
maxim=a[p+dx[i]][q+dy[i]];
}
Coada.push(make_pair(p+dx[i],q+dy[i]));
}
}
}
}
bool verificare(int d)
{
int p,q,i,j;
if(a[start.first][start.second]<d)
{
return 0;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
b[i][j]=0;
}
}
Coada.push(start);
while(!Coada.empty() && b[finish.first][finish.second]==0)
{
p=Coada.front().first;
q=Coada.front().second;
Coada.pop();
for(i=0;i<4;i++)
{
if(b[p+dx[i]][q+dy[i]]==0 && a[p+dx[i]][q+dy[i]]>=d)
{
b[p+dx[i]][q+dy[i]]=1;
Coada.push(make_pair(p+dx[i],q+dy[i]));
}
}
}
while(!Coada.empty())
{
Coada.pop();
}
if(b[finish.first][finish.second]==1)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
int i,j,st,dr,val,mij;
f>>n>>m;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
f>>x;
if(x=='I')
{
start=make_pair(i,j);
}
if(x=='D')
{
a[i][j]=-1;
Coada.push(make_pair(i,j));
}
if(x=='*')
{
a[i][j]=-1;
}
if(x=='O')
{
finish=make_pair(i,j);
}
}
}
for(i=0;i<=n+1;i++)
{
a[i][0]=a[i][m+1]=-1;
}
for(i=0;i<=m+1;i++)
{
a[0][i]=a[n+1][i]=-1;
}
BFS();
st=1;
dr=maxim;
val=-1;
while(st<=dr)
{
mij=(st+dr)/2;
if(verificare(mij)==1)
{
val=mij;
st=mij+1;
}
else
{
dr=mij-1;
}
}
g<<val;
return 0;
}