Pagini recente » Cod sursa (job #2415346) | Cod sursa (job #81839) | Cod sursa (job #562004) | Cod sursa (job #1175411) | Cod sursa (job #2417274)
#include <cstdio>
#include <queue>
const int NMAX=1005;
using namespace std;
char a[NMAX][NMAX];
int cnt[NMAX][NMAX];
int viz[NMAX][NMAX];
int di[]={0,-1,0,1};
int dj[]={-1,0,1,0};
int l,c;
bool check(int x)
{
for(int i=0; i<l; ++i)
for(int j=0; j<c; ++j)
viz[i][j]=0;
queue <pair<int,int>> q;
for(int i=0; i<l; ++i)
{
for(int j=0; j<c; ++j)
if(a[i][j]=='I'){
q.push({i,j});
break;
}
if(!q.empty())
break;
}
if(cnt[q.front().first][q.front().second]<x)
return 0;
while(!q.empty())
{
pair <int,int> curr;
curr=q.front();
q.pop();
for(int i=0; i<4; ++i)
{
pair <int,int> newcurr;
newcurr.first=curr.first+di[i];
newcurr.second=curr.second+dj[i];
if((newcurr.first>=0 && newcurr.first<l) &&(newcurr.second>=0 && newcurr.second<c) && (a[newcurr.first][newcurr.second]=='.' || a[newcurr.first][newcurr.second]=='O' || a[newcurr.first][newcurr.second]=='D') && viz[newcurr.first][newcurr.second]==0 && cnt[newcurr.first][newcurr.second]>=x){
viz[newcurr.first][newcurr.second]=viz[curr.first][curr.second]+1;
q.push(newcurr);
if(a[curr.first][curr.second]=='O')
return 1;
}
}
}
return 0;
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d",&l,&c);
for(int i=0; i<l; ++i){
scanf("%s",a[i]);
}
queue <pair<int,int>> q;
for(int i=0; i<l; ++i)
for(int j=0; j<c; ++j)
if(a[i][j]=='D')
q.push({i,j});
while(!q.empty())
{
pair <int,int> curr;
curr=q.front();
q.pop();
for(int i=0; i<4; ++i)
{
pair <int,int> newcurr;
newcurr.first=curr.first+di[i];
newcurr.second=curr.second+dj[i];
if((newcurr.first>=0 && newcurr.first<l) &&(newcurr.second>=0 && newcurr.second<c) && (a[newcurr.first][newcurr.second]=='.' || a[newcurr.first][newcurr.second]=='O' || a[newcurr.first][newcurr.second]=='I') && cnt[newcurr.first][newcurr.second]==0){
cnt[newcurr.first][newcurr.second]=cnt[curr.first][curr.second]+1;
q.push(newcurr);
}
}
}
int st=0;
int dr=l*c;
int best=1e9;
while(st<=dr)
{
int mij=(st+dr)>>1;
if(check(mij))
{
best=mij;
st=mij+1;
}
else
dr=mij-1;
}
if(best==1e9)
printf("-1\n");
else
printf("%d\n",best);
return 0;
}