Pagini recente » Cod sursa (job #2673836) | Cod sursa (job #2218975) | Cod sursa (job #995233) | Cod sursa (job #685961) | Cod sursa (job #2240491)
#include<cstdio>
#include<fstream>
#include<queue>
using namespace std;
FILE *f=fopen("barbar.in","r");
ofstream g("barbar.out");
char s[1002][1002];
int a[1002][1002],coada[1000002][2],n,m,x1,y1,x2,y2;
int dx[]={1,-1,0, 0};
int dy[]={0, 0,1,-1};
bool visited[1002][1002];
struct elem
{
int x,y;
};
queue <elem> q;
int valid(int x,int y)
{
return x>=1&&x<=n&&y>=1&&y<=m&&visited[x][y]==0&&s[x][y]!='*';
}
int lee(int q)
{
int l=1,r=0,i=x1,j=y1;
visited[i][j]=1;
coada[++r][0]=i;
coada[r][1]=j;
if(a[i][j]>=q)
{
while(l<=r)
{
i=coada[l][0];
j=coada[l][1];
if(i+1<=n&&a[i+1][j]>=q&&visited[i+1][j]==0&&s[i+1][j]!='*')
{
coada[++r][0]=i+1;
coada[r][1]=j;
if(coada[r][0]==x2&&coada[r][1]==y2)
return 1;
visited[i+1][j]=1;
}
if(i-1>=1&&a[i-1][j]>=q&&visited[i-1][j]==0&&s[i-1][j]!='*')
{
coada[++r][0]=i-1;
coada[r][1]=j;
if(coada[r][0]==x2&&coada[r][1]==y2)
return 1;
visited[i-1][j]=1;
}
if(j+1<=m&&a[i][j+1]>=q&&visited[i][j+1]==0&&s[i][j+1]!='*')
{
coada[++r][0]=i;
coada[r][1]=j+1;
if(coada[r][0]==x2&&coada[r][1]==y2)
return 1;
visited[i][j+1]=1;
}
if(j-1>=1&&a[i][j-1]>=q&&visited[i][j-1]==0&&s[i][j-1]!='*')
{
coada[++r][0]=i;
coada[r][1]=j-1;
if(coada[r][0]==x2&&coada[r][1]==y2)
return 1;
visited[i][j-1]=1;
}
l++;
}
}
return 0;
}
int main()
{
int i,j,maxim=0,st,dr,mij;
char c;
fscanf(f,"%d%d",&n,&m);
fscanf(f,"%c",&c);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
fscanf(f,"%c",&s[i][j]);
if(s[i][j]=='I')
x1=i,y1=j;
if(s[i][j]=='O')
x2=i,y2=j;
if(s[i][j]=='D')
q.push({i,j}),visited[i][j]=1;
}
fscanf(f,"%c",&c);
}
while(!q.empty())
{
for(i=0;i<=3;i++)
if(valid(q.front().x+dx[i],q.front().y+dy[i]))
{
q.push({q.front().x+dx[i],q.front().y+dy[i]});
visited[q.front().x+dx[i]][q.front().y+dy[i]]=1;
a[q.front().x+dx[i]][q.front().y+dy[i]]=a[q.front().x][q.front().y]+1;
}
q.pop();
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(a[i][j]>=maxim)
maxim=a[i][j];
st=0;
dr=maxim;
while(st<=dr)
{
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
visited[i][j]=0;
mij=(st+dr)/2;
if(lee(mij)==1)
st=mij+1;
else
dr=mij-1;
}
g<<st-1;
return 0;
}