Pagini recente » Cod sursa (job #862518) | Cod sursa (job #1294195) | Cod sursa (job #753713) | Cod sursa (job #2620865) | Cod sursa (job #2444951)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define f first
#define s second
#define pb push_back
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int n,m,dist[1005][1005];
bool b[1005][1005],b1[1005][1005];
char a[1005][1005];
pair <int,int> inc,fin;
vector <pair<int,int> > dragon;
queue <pair<int,int> > q;
bool verif(int x,int y)
{
if(x>0 && y>0 && x<=n && y<=m)return 1;
return 0;
}
bool parc(int dis)
{
int x,y,ok=0;
q.push(make_pair(inc.f,inc.s));
b1[inc.f][inc.s]=1;
while(!q.empty())
{
x=q.front().f;
y=q.front().s;
q.pop();
for(int i=0;i<4;i++)
{
int x1=x+dx[i];
int y1=y+dy[i];
if(verif(x1,y1) && !b1[x1][y1] && a[x1][y1]!='D' && dist[x1][y1]>=dis)
{
b1[x1][y1]=1;
if(a[x1][y1]=='O')ok=1;
q.push(make_pair(x1,y1));
}
}
}
if(ok)return 1;
return 0;
}
int cb()
{
int poz=0;
for(int i=1<<30;i>0;i=i/2)
{
if(poz+i<=dist[fin.f][fin.s])
{
if(parc(poz+i))
{
poz+=i;
}
}
}
if(poz==0)return -1;
return poz;
}
void distanta()
{
int x,y;
int sz=dragon.size();
for(int i=0;i<=sz;i++)
{
q.push(make_pair(dragon[i].f,dragon[i].s));
}
while(!q.empty())
{
x=q.front().f;
y=q.front().s;
q.pop();
for(int i=0;i<4;i++)
{
int x1=x+dx[i];
int y1=y+dy[i];
if(verif(x1,y1) && !b[x1][y1] && a[x1][y1]!='D')
{
b[x1][y1]=1;
dist[x1][y1]=dist[x][y]+1;
q.push(make_pair(x1,y1));
}
}
}
}
int main()
{
in>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
in>>a[i][j];
if(a[i][j]=='I')inc.f=i,inc.s=j;
if(a[i][j]=='O')fin.f=i,fin.s=j;
if(a[i][j]=='D')dragon.pb(make_pair(i,j));
if(a[i][j]=='*')b[i][j]=1,b1[i][j]=1;
}
}
distanta();
out<<cb();
return 0;
}