Pagini recente » Cod sursa (job #2947308) | Cod sursa (job #1945686) | Cod sursa (job #1918193) | Cod sursa (job #2187404) | Cod sursa (job #2907927)
#include <fstream>
#include <queue>
using namespace std;
const int N=1010;
int N_piv, M_piv;
bool mat_castle[N][N];
int dist_dragoni[N][N];
struct coord
{
int l,c;
};
queue<coord>dragons_queue;
queue<coord>qu_wayon;
coord start,fin;
const int lin[4]={-1,0,1,0};
const int col[4]={0,-1,0,1};
bool in_mat(coord next_poz)
{
return next_poz.l>=0 && next_poz.l<N_piv && next_poz.c>=0 && next_poz.c<M_piv;
}
void lee_dr()
{
while(!dragons_queue.empty())
{
coord cur=dragons_queue.front();
dragons_queue.pop();
for(int i=0;i<=3;i++)
{
coord urm;
urm.l=cur.l+lin[i];
urm.c=cur.c+col[i];
if(in_mat(urm) && dist_dragoni[urm.l][urm.c]==0)
{
dist_dragoni[urm.l][urm.c]=dist_dragoni[cur.l][cur.c]+1;
dragons_queue.push(urm);
}
}
}
}
void principal_lee(int dist_to_dr)
{
qu_wayon.push(start);
mat_castle[start.l][start.c]=1;
while(!qu_wayon.empty())
{
coord cur=qu_wayon.front();
qu_wayon.pop();
for(int i=0;i<=3;i++)
{
coord urm;
urm.l=cur.l+lin[i];
urm.c=cur.c+col[i];
if(in_mat(urm) && dist_dragoni[urm.l][urm.c]>=dist_to_dr && mat_castle[urm.l][urm.c]==0)
{
mat_castle[urm.l][urm.c]=1;
qu_wayon.push(urm);
}
}
}
}
bool is_way(int d)
{
for(int i=0 ;i<N_piv;i++)
for(int j=0 ; j<M_piv;j++)
mat_castle[i][j]=0;
principal_lee(d);
if(mat_castle[fin.l][fin.c]!=0)
return true;
return false;
}
int main()
{
ifstream in("barbar.in");
ofstream out("barbar.out");
in>>N_piv>>M_piv;
in.get();
for(int i=0;i<N_piv;i++)
{
for(int j=0;j<M_piv;j++)
{
char c;
in.get(c);
if(c=='D')
{
coord dragon;
dragon.l=i;
dragon.c=j;
dragons_queue.push(dragon);
dist_dragoni[i][j]=1;
}
else if(c=='I')
{
start.l=i;
start.c=j;
}
else if(c=='*')
{
dist_dragoni[i][j]=-1;
}
else if(c=='O')
{
fin.l=i;
fin.c=j;
}
}
in.get();
}
lee_dr();
int st=0, dr=dist_dragoni[start.l][start.c], dist_max=0;
while(st<=dr)
{
int dist=(st+dr)/2;
if(dist != 0 && is_way(dist))
{
dist_max=dist;
st=dist+1;
}
else
dr=dist-1;
}
out<< dist_max-1 ;
in.close();
out.close();
return 0;
}