Pagini recente » Cod sursa (job #1170252) | Cod sursa (job #2037371) | Cod sursa (job #2255385) | Cod sursa (job #2815032) | Cod sursa (job #3263128)
#include <fstream>
#include <queue>
using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
queue<pair<int,int>>q;
char v[1005][1005];
int dist[1005][1005];
int n,m, inceputi=0, inceputj=0;
void dragon()
{
while(!q.empty())
{
int x=q.front().first, y=q.front().second;
q.pop();
if(x-1>0 && dist[x-1][y]==-1)
{
dist[x-1][y]=dist[x][y]+1;
q.push({x-1,y});
}
if(x+1<=n && dist[x+1][y]==-1)
{
dist[x+1][y]=dist[x][y]+1;
q.push({x+1,y});
}
if(y-1>0 && dist[x][y-1]==-1)
{
dist[x][y-1]=dist[x][y]+1;
q.push({x,y-1});
}
if(y+1<=n && dist[x][y+1]==-1)
{
dist[x][y+1]=dist[x][y]+1;
q.push({x,y+1});
}
}
}
bool verif(int l)
{
q.push({inceputi,inceputj});
bool parcurs[1005][1005];
while(!q.empty())
{
int x=q.front().first, y=q.front().second;
q.pop();
//parcurs[x][y]=1;
if(v[x][y]=='O')
{
while(!q.empty())
q.pop();
return 1;
}
if(x-1>0 && !parcurs[x-1][y] && dist[x-1][y]>=l)
{
parcurs[x-1][y]=1;
q.push({x-1,y});
}
if(x+1<=n && !parcurs[x+1][y] && dist[x+1][y]>=l)
{
parcurs[x+1][y]=1;
q.push({x+1,y});
}
if(y-1>0 && !parcurs[x][y-1] && dist[x][y-1]>=l)
{
parcurs[x][y-1]=1;
q.push({x,y-1});
}
if(y+1<=n && !parcurs[x][y+1] && dist[x][y+1]>=l)
{
parcurs[x][y+1]=1;
q.push({x,y+1});
}
}
return 0;
}
int cautbin()
{
int st=1, dr=2000,bun=-1;
while(st<=dr)
{
int mid=(st+dr)/2;
if(verif(mid))
bun=mid, st=mid+1;
else
dr=mid-1;
}
return bun;
}
int main()
{
cin>>n>>m;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
cin>>v[i][j];
if(v[i][j]=='I')
inceputi=i, inceputj=j;
}
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
if(v[i][j]=='D')
q.push({i,j});
else if(v[i][j]=='*')
dist[i][j]=-2;
else
dist[i][j]=-1;
}
}
dragon();
cout<<cautbin();
// cout<<verif(2);
return 0;
}