Pagini recente » Cod sursa (job #3282944) | Cod sursa (job #1636808) | Cod sursa (job #2791648) | Cod sursa (job #1016507) | Cod sursa (job #2076725)
#include <fstream>
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
queue<pair<int,int> > Q;
int n,m,xs,ys,xf,yf;
char v[1005][1005];
int dist[1005][1005];
bitset<1001>viz[1001];
int dx[4]={0,1,-1,0};
int dy[4]={1,0,0,-1};
void lee()
{
while(Q.size())
{
int a=Q.front().first;
int b=Q.front().second;
for(int i=0;i<4;i++)
{
int x=a+dx[i];
int y=b+dy[i];
if(v[x][y]=='.' && (dist[x][y]==0 || dist[x][y]>dist[a][b]+1))
{
dist[x][y]=dist[a][b]+1;
Q.push(make_pair(x,y));
}
}
Q.pop();
}
}
bool verif(int mij)
{
Q.push(make_pair(xs,ys));
while(Q.size())
{
int a=Q.front().first;
int b=Q.front().second;
for(int i=0;i<4;i++)
{
int x=a+dx[i];
int y=b+dy[i];
if((v[x][y]=='.' && dist[x][y]>=mij && viz[x][y]==0)||(x==xf && y==yf))
{
viz[x][y]=1;
Q.push(make_pair(x,y));
}
}
Q.pop();
}
if(viz[xf][yf]==1) return 1;
else return 0;
}
int main()
{
int n,m,i,j;
fin>>n>>m;
for(i=1;i<=n;i++) fin>>(v[i]+1);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(v[i][j]=='D') Q.push(make_pair(i,j));
if(v[i][j]=='I') xs=i,ys=j,v[i][j]='.';
if(v[i][j]=='O') xf=i,yf=j,v[i][j]='.';
}
}
lee();
int st=0,dr=n*m+1,mij,last=0;
while(st<=dr)
{
mij=(st+dr)/2;
if(verif(mij)==1)
{
last=mij;
st=mij+1;
}
else dr=mij-1;
memset(viz,0,sizeof(viz));
}
if(last==0)
{
fout<<-1;
}
else fout<<last;
}