Pagini recente » Cod sursa (job #1341557) | Cod sursa (job #2533312) | Cod sursa (job #1521332) | Cod sursa (job #1039529) | Cod sursa (job #1853050)
#include <iostream>
#include <fstream>
#include <queue>
#include <utility>
using namespace std;
ifstream fi ("barbar.in");
ofstream fo ("barbar.out");
struct coord{
int x, y;
bool operator ==(coord b){
return (x==b.x && y==b.y);
}
coord operator +(coord b){
return {x+b.x,y+b.y};
}
void operator =(coord b){
x=b.x;
y=b.y;
}
coord operator -(coord b){
return {x-b.x,y-b.y};
}
} dragoni[1000000], dir[4]={ {-1,0}, {0,1}, {1,0}, {0,-1} }, intr, uscita;
bool obs[1002][1002], mark[1002][1002];
queue <pair<coord,int>> q;
int dist[1002][1002], n, m;
inline bool existadrum(int dmin){
coord loc;
int i, j;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
mark[i][j]=false;
q.push({intr,0});
mark[intr.x][intr.y]=true;
while(q.size()>0){
loc=q.front().first;
for(i=0;i<4;i++){
loc=loc+dir[i];
if(!obs[loc.x][loc.y] && !mark[loc.x][loc.y] && dist[loc.x][loc.y]>=dmin){
q.push({loc,0});
mark[loc.x][loc.y]=true;
}
loc=loc-dir[i];
}
q.pop();
}
return mark[uscita.x][uscita.y];
}
int main()
{
int nrd, i, j, d, rez, pas;
fi>>n>>m;
char ch;
coord loc;
nrd=0;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
fi>>ch;
if(ch=='*')
obs[i][j]=true;
if(ch=='D')
dragoni[nrd++]={i,j};
if(ch=='I')
intr={i,j};
if(ch=='O')
uscita={i,j};
}
for(i=0;i<=n+1;i++)
obs[i][0]=obs[i][m+1]=true;
for(j=0;j<=m;j++)
obs[0][j]=obs[n+1][j]=true;
for(i=0;i<nrd;i++){
q.push({dragoni[i],0});
mark[dragoni[i].x][dragoni[i].y]=true;
}
while(q.size()>0){
loc=q.front().first;
d=q.front().second;
dist[loc.x][loc.y]=d;
for(i=0;i<4;i++){
loc=loc+dir[i];
if(!obs[loc.x][loc.y] && !mark[loc.x][loc.y]){
q.push({loc,d+1});
mark[loc.x][loc.y]=true;
}
loc=loc-dir[i];
}
q.pop();
}
rez=0;
for(pas=1<<9;pas>=1;pas/=2)
if(pas+rez<min(n,m) && existadrum(pas+rez))
rez+=pas;
if(rez>0)
fo<<rez;
else
fo<<-1;
return 0;
}