Pagini recente » Cod sursa (job #2115015) | Cod sursa (job #2939760) | Cod sursa (job #1348233) | Cod sursa (job #1857180) | Cod sursa (job #2869100)
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int INF=1e9;
const int NMAX=1005;
char s[NMAX][NMAX];
int b[NMAX][NMAX];
int n,m,ok;
int istart,jstart,ifinal,jfinal;
int viz[NMAX][NMAX];
queue<pair<int,int >>q;
const int di[]={-1,1,0,0};
const int dj[]={0,0,1,-1};
bool inmat(int i,int j)
{
return i>=1 && j>=1 && i<=n && j<=m;
}
void fill(int i,int j,int x)
{
if(inmat(i,j) && ok==1 && s[i][j]!='*' && b[i][j]>=x && viz[i][j]==0)
{
viz[i][j]=1;
if(i==ifinal && j==jfinal)
ok=0;
fill(i+1,j,x);
fill(i-1,j,x);
fill(i,j+1,x);
fill(i,j-1,x);
}
}
bool verif(int x)
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
viz[i][j]=0;
ok=1;
fill(istart,jstart,x);
return viz[ifinal][jfinal];
}
int main()
{
int i,j,x,y,ii,jj;
int kon=-1;
fin>>n>>m;
for(i=1;i<=n;i++) ///citire
for(j=1;j<=m;j++)
{
fin>>s[i][j];
b[i][j]=INF;
if(s[i][j]=='I')
{
istart=i;
jstart=j;
}
else if (s[i][j] == 'O')
{
ifinal=i;
jfinal=j;
}
else if(s[i][j]=='D')
{
b[i][j]=0;
q.push(make_pair(i,j));
}
}
while(!q.empty()) ///bfs
{
pair<int,int>p=q.front();
x=p.first;
y=p.second;
q.pop();
for(i=0;i<=3;i++)
{
ii=x+di[i];
jj=y+dj[i];
if(inmat(ii,jj) && b[ii][jj]>1+b[x][y] && s[ii][jj]!='*')
{
b[ii][jj]=b[x][y]+1;
q.push(make_pair(ii,jj));
}
}
}
int st=1;
int dr=b[ifinal][jfinal];
int mij;
while(st<=dr) ///cautare binara
{
mij=(st+dr)/2;
if(verif(mij))
{
kon=mij;
st=mij+1;
}
else
dr=mij-1;
}
fout <<kon<<"\n";
return 0;
}