Pagini recente » Cod sursa (job #3145566) | Cod sursa (job #2796740) | Cod sursa (job #343213) | Cod sursa (job #2458208) | Cod sursa (job #2764889)
#include <fstream>
#include <queue>
#include <cstring>
using namespace std;
string v[1005];
int a[1005][1005],mat[1005][1005];
int r,c;
int dx[5]={-1,1,0,0}, dy[5]={0,0,-1,1};
struct pt_lee
{
int linia,coloana;
};
bool verif(pt_lee x)
{
return x.linia>0 && x.coloana>0 && x.linia<=r && x.coloana<=c;
}
queue <pt_lee> q;
void lee_dragoni()
{
while(!q.empty())
{
for(int i=0;i<4;i++)
{
pt_lee vecin;
vecin.linia=q.front().linia+dx[i];
vecin.coloana=q.front().coloana+dy[i];
if(verif(vecin) && a[vecin.linia][vecin.coloana]==0)
{
a[vecin.linia][vecin.coloana]=a[q.front().linia][q.front().coloana]+1;
q.push(vecin);
}
}
q.pop();
}
}
void lee(int valoare, pt_lee coord_inceput)
{
memset(mat,0,sizeof mat);
mat[coord_inceput.linia][coord_inceput.coloana]=1;
if(a[coord_inceput.linia][coord_inceput.coloana]-1>=valoare)
q.push(coord_inceput);
while(!q.empty())
{
for(int i=0;i<4;i++)
{
pt_lee vecin;
vecin.linia=q.front().linia+dx[i];
vecin.coloana=q.front().coloana+dy[i];
if(verif(vecin) && a[vecin.linia][vecin.coloana]-1>=valoare && mat[vecin.linia][vecin.coloana]==0)
{
/*if(valoare==3 && vecin.linia==coord_sf)
{
int s;
s=0;
}*/
mat[vecin.linia][vecin.coloana]=mat[q.front().linia][q.front().coloana]+1;
q.push(vecin);
}
}
q.pop();
}
}
int cautare_binara(int st,int dr,pt_lee coord_inceput, pt_lee coord_sfarsit)
{
int val=-1;
while(st<=dr)
{
int mij=(st+dr)/2;
lee(mij,coord_inceput);
if(mat[coord_sfarsit.linia][coord_sfarsit.coloana]!=0)
{
st=mij+1;
val=mij;
}
else
{
dr=mij-1;
}
}
return val;
}
int main()
{
ifstream fin("barbar.in");
ofstream fout("barbar.out");
fin>>r>>c;
for(int i=1;i<=r;i++)
{
fin>>v[i];
}
pt_lee coord_inceput,coord_sfarsit;
for(int i=1;i<=r;i++)
{
for(int j=0;j<c;j++)
{
if(v[i][j]=='.')
{
a[i][j+1]=0;
mat[i][j+1]=0;
}
else if(v[i][j]=='*')
{
a[i][j+1]=-2;
mat[i][j+1]=-2;
}
else if(v[i][j]=='D')
{
a[i][j+1]=1;
mat[i][j+1]=-1;
pt_lee x;
x.linia=i;
x.coloana=j+1;
q.push(x);
}
else if(v[i][j]=='I')
{
coord_inceput.linia=i;
coord_inceput.coloana=j+1;
}
else
{
coord_sfarsit.linia=i;
coord_sfarsit.coloana=j+1;
}
}
}
lee_dragoni();
int st=1,dr=r*c;
fout<<cautare_binara(st,dr,coord_inceput,coord_sfarsit);
return 0;
}