Pagini recente » Cod sursa (job #158975) | Cod sursa (job #2914664)
#include <fstream>
#include <iostream>
#include <queue>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
char c[1001][1001];
int n,m;
struct lincol
{
int lin,col;
};
int nou[1001][1001],verif[1001][1001];
queue<lincol>dragon;
queue<lincol>q;
lincol inceput,destinatia;///I,O
int di[]={-1,0,1,0};
int dj[]={0,1,0,-1};
bool bariera(lincol x)
{
if(x.lin>=0 && x.col>=0 && x.lin<n && x.col<m)
return true;
return false;
}
void lee()
{
while(!dragon.empty())
{
lincol curent=dragon.front();
dragon.pop();
for(int k=0;k<=3;k++)
{
lincol vecin;
vecin.lin=curent.lin+di[k];
vecin.col=curent.col+dj[k];
if(bariera(vecin) && nou[vecin.lin][vecin.col]==0)
{
dragon.push(vecin);
nou[vecin.lin][vecin.col]=nou[curent.lin][curent.col]+1;
}
}
}
}
int existatraseu(lincol start,lincol dest,int prag)
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(nou[i][j]-1<prag)///sunt cu 1 in plus
verif[i][j]=-1;
else
verif[i][j]=0;
}
verif[start.lin][start.col]=1;
q.push(start);
while(!q.empty())
{
lincol curent=q.front();
q.pop();
for(int i=0;i<=3;i++)
{
lincol vecin;
vecin.lin=curent.lin+di[i];
vecin.col=curent.col+dj[i];
if(bariera(vecin) && verif[vecin.lin][vecin.col]==0)
{
q.push(vecin);
verif[vecin.lin][vecin.col]=verif[curent.lin][curent.col]+1;
}
}
}
return verif[dest.lin][dest.col]-1;
}
int cautbin(int st,int dr)
{
int rasp=-1;
while(st<=dr)
{
int mij=(st+dr)/2;
if(existatraseu(inceput,destinatia,mij)>0)
{
rasp=mij;
st=mij+1;
}
else
dr=mij-1;
}
return rasp;
}
int main()
{
in>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
in>>c[i][j];
if(c[i][j]=='*')
nou[i][j]=-2;
lincol D;
D.lin=i;
D.col=j;
if(c[i][j]=='D')
{
dragon.push(D);
nou[i][j]=1;
}
if(c[i][j]=='I')
{
inceput.lin=i;
inceput.col=j;
}
if(c[i][j]=='O')
{
destinatia.lin=i;
destinatia.col=j;
}
}
lee();
out<<cautbin(1,n*m)<<'\n';
/*for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
if(nou[i][j]!=-2)
out<<nou[i][j]-1<<' ';
else
out<<nou[i][j]<<' ';
out<<'\n';
}*/
return 0;
}