Pagini recente » Cod sursa (job #2020221) | Cod sursa (job #1180221) | Cod sursa (job #167530) | Cod sursa (job #1084078) | Cod sursa (job #2320729)
#include <bits/stdc++.h>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int n,m,i,j,mi,dirx[10],diry[10],a[1010][1010],viz[1010][1010],dist[1010][1010];
queue<pair<int,int> > Q;
pair<int,int> in,out;
string s;
bool dfs(int i,int j)
{
viz[i][j]=1;
if(i==out.first&&j==out.second)return 1;
for(int k=1;k<=4;k++)
if(a[i+dirx[k]][j+diry[k]])
if(mi<=dist[i+dirx[k]][j+diry[k]])
if(!viz[i+dirx[k]][j+diry[k]])
if(dfs(i+dirx[k],j+diry[k]))
return 1;
return 0;
}
bool ok()
{
if(dist[in.first][in.second]<mi)return 0;
memset(viz,0,sizeof(viz));
bool ok=dfs(in.first,in.second);
// g<<mi<<'\n';
// for(i=1;i<=n;i++)
// {
// for(j=1;j<=m;j++)
// g<<viz[i][j]<<' ';
// g<<'\n';
// }g<<'\n';
return ok;
}
int main()
{
f>>n>>m;
dirx[1]=1;diry[1]=0;
dirx[2]=0;diry[2]=1;
dirx[3]=-1;diry[3]=0;
dirx[4]=0;diry[4]=-1;
for(i=1;i<=n;i++)
{
f>>s;
for(j=1;j<=m;j++)
{
if(s[j-1]=='.')a[i][j]=1;
if(s[j-1]=='I')a[i][j]=1,in={i,j};
if(s[j-1]=='O')a[i][j]=1,out={i,j};
if(s[j-1]=='D')Q.push({i,j}),viz[i][j]=1;
}
}
while(Q.size())
{
pair<int,int> x=Q.front();
Q.pop();
for(i=1;i<=4;i++)
if(a[x.first+dirx[i]][x.second+diry[i]])
if(!viz[x.first+dirx[i]][x.second+diry[i]])
{
dist[x.first+dirx[i]][x.second+diry[i]]=dist[x.first][x.second]+1;
viz[x.first+dirx[i]][x.second+diry[i]]=1;
Q.push({x.first+dirx[i],x.second+diry[i]});
}
}
int lo=0,hi=n*n;
while(lo<hi)
{
mi=(lo+hi)/2;
if(ok())
lo=mi+1;
else
hi=mi;
}
g<<lo-1;
return 0;
}