Pagini recente » Cod sursa (job #783156) | Cod sursa (job #3185277) | Cod sursa (job #529205) | Cod sursa (job #470873) | Cod sursa (job #3233874)
#include <fstream>
#include <queue>
#include <cstring>
using namespace std;
ifstream cin("barbar.in");
ofstream cout ("barbar.out");
int mat[1001][1001];
bool visit[1001][1001];
struct coord
{
int x,y;
};
bool isvalid(coord coord_c,int r,int c)
{
return(coord_c.x>0 and coord_c.x<=r and coord_c.y>0 and coord_c.y<=c and mat[coord_c.x][coord_c.y]!=-1);
}
coord vecini[4]= {{0,1},{1,0},{0,-1},{-1,0}};
void dragon(queue<coord> q,int r,int c)
{
while(!q.empty())
{
coord current=q.front();
q.pop();
for(int k=0; k<4; k++)
{
coord vecin= {current.x+vecini[k].x,current.y+vecini[k].y};
if(isvalid(vecin,r,c) && mat[vecin.x][vecin.y] == 0)
{
q.push(vecin);
mat[vecin.x][vecin.y]=mat[current.x][current.y]+1;
}
}
}
}
void lee(coord strt,int r,int c,int minval)
{
queue <coord> q;
q.push(strt);
visit[strt.x][strt.y] = 1;
while(!q.empty())
{
coord current=q.front();
q.pop();
for(int k=0; k<4; k++)
{
coord vecin={current.x+vecini[k].x,current.y+vecini[k].y};
if(isvalid(vecin,r,c) and visit[vecin.x][vecin.y]==0 and mat[vecin.x][vecin.y]>=minval)
{
q.push(vecin);
visit[vecin.x][vecin.y]=1;
}
}
}
}
int cautbin(int r,int c,coord inc,coord ies)
{
int st=0,dr=2001,lastval=-1;
while(st<=dr)
{
memset(visit,0,sizeof visit);
int med=(st+dr)/2;
lee(inc,r,c,med);
// for(int i=1; i<=r; i++)
// {
// cout<<'\n';
// for(int j=1; j<=c; j++)
// cout<<visit[i][j];
// }
if(visit[ies.x][ies.y])
{
st=med+1;
lastval=med;
}
else {
dr=med-1;
}
}
return lastval;
}
int main()
{
queue <coord> drag;
coord inc,ies;
int r,c;
cin>>r>>c;
for(int i=1; i<=r; i++)
{
string s;
cin>>s;
for(int j=0; j<c; j++)
{
/// lib=0,perete=-1,dragon=1,start=2,end=3
char x;
x=s[j];
if(x=='*')
mat[i][j+1]=-1;
if(x=='D')
{
coord temp;
temp.x=i;
temp.y=j+1;
drag.push(temp);
mat[i][j+1]=0;
}
if(x=='I')
{
inc.x=i;
inc.y=j+1;
}
if(x=='O')
{
ies.x=i;
ies.y=j+1;
}
}
}
dragon(drag,r,c);
// for(int i=1; i<=r; i++)
// {
// cout<<'\n';
// for(int j=1; j<=c; j++)
// cout<<mat[i][j];
// }
int rasp=cautbin(r,c,inc,ies);
cout<<rasp;
return 0;
}