Pagini recente » Cod sursa (job #2695225) | Cod sursa (job #459939) | Cod sursa (job #337857) | Cod sursa (job #332611) | Cod sursa (job #3297710)
#include <bits/stdc++.h>
#define NMAX 1002
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
struct pos{
int y,x,d;
};
bool operator<(const pos &p1, const pos&p2)
{
return p1.d < p2.d;
}
int N,M;
int stx,sty,fix,fiy;
char a[NMAX][NMAX];
queue <pos> q;
int dist[NMAX][NMAX];
int vizitat[NMAX][NMAX];
bool isin(int y,int x)
{
return y>=1 && x>=1 && y<=N && x<=M;
}
bool sol(int d)
{
queue <pos> q;
q.push({sty,stx,-1});
while(!q.empty()){
int y=q.front().y;
int x=q.front().x;
q.pop();
if(isin(y,x) && a[y][x]=='.' && vizitat[y][x]!=d && dist[y][x]>d){
vizitat[y][x]=d;
q.push({y-1,x,-1});
q.push({y+1,x,-1});
q.push({y,x-1,-1});
q.push({y,x+1,-1});
}
}
return (vizitat[fiy][fix]!=d);
}
int find_sol(int lwr,int upr)
{
int ret=0;
while(lwr<upr){
int mid=(lwr+upr)/2;
if(sol(mid)){
ret=mid;
upr=mid-1;
}else{
lwr=mid+1;
}
}
return ret-1;
}
int main()
{
fin >> N >> M;
for(int i=1;i<=N;i++){
for(int j=1;j<=M;j++){
fin >> a[i][j];
if(a[i][j]=='D'){
q.push({i,j,1});
a[i][j]='.';
}else if(a[i][j]=='I'){
stx=j;
sty=i;
a[i][j]='.';
}else if(a[i][j]=='O'){
fix=j;
fiy=i;
a[i][j]='.';
}
}
}
///gasim dist pana la dragoni
while(!q.empty()){
int y=q.front().y;
int x=q.front().x;
int d=q.front().d;
q.pop();
if(isin(y,x) && a[y][x]=='.' && dist[y][x]==0){
dist[y][x]=d;
d++;
q.push({y+1,x,d});
q.push({y-1,x,d});
q.push({y,x+1,d});
q.push({y,x-1,d});
}
}
fout << find_sol(1,1000000);
}