Pagini recente » Cod sursa (job #631834) | Cod sursa (job #2530350) | Cod sursa (job #119036) | Cod sursa (job #2798586) | Cod sursa (job #2478333)
#include <bits/stdc++.h>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
vector<int>v[1000010];
queue<int>q;
int t;
struct
{
int p1,p2;
}sol[1000001];
int m,n,final1,maxim,cod_inceput,cod_final,final2,viz[1000010],lungime[1000010];
char a[1010][1010];
/*void fil(int poz1,int poz2,int minim)
{
int cod;
cout<<poz1<<" "<<poz2<<" "<<minim<<'\n';
if(poz1==final1 && poz2==final2)
{
if(minim>maxim)maxim=minim;
}
if(viz[poz1+1][poz2]==0 && a[poz1+1][poz2]!='*') {cod=m*poz1+poz2; viz[poz1+1][poz2]=1; fil(poz1+1,poz2,min(minim,lungime[cod]));}
if(viz[poz1-1][poz2]==0 && a[poz1-1][poz2]!='*') {cod=m*(poz1-2)+poz2; viz[poz1-1][poz2]=1; fil(poz1-1,poz2,min(minim,lungime[cod]));}
if(viz[poz1][poz2+1]==0 && a[poz1][poz2+1]!='*') {cod=m*(poz1-1)+(poz2+1); viz[poz1][poz2+1]=1; fil(poz1,poz2+1,min(minim,lungime[cod]));}
if(viz[poz1][poz2-1]==0 && a[poz1][poz2-1]!='*') {cod=m*(poz1-1)+(poz2-1); viz[poz1][poz2-1]=1; fil(poz1,poz2-1,min(minim,lungime[cod]));}
}
*/
int DFS(int nod,int minim)
{
int vecin;
viz[nod]=1;
if(nod==cod_final)
{
return 1;
}
else
{
int ok=0;
for(int i=0;i<v[nod].size();i++)
{
vecin=v[nod][i];
if(!viz[vecin] && lungime[vecin]>=minim)
{
viz[vecin]=1;
ok=max(ok,DFS(vecin,minim));
}
}
return ok;
}
}
int i,j,cod1,p,u,mij,copie,nod,vecin,cod2,inceput1,inceput2,cod;
int main()
{
f>>n>>m;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
f>>a[i][j];
cod=m*(i-1)+j;
lungime[cod]=-1;
}
}
// BORDARE
for(i=0;i<=n+1;i++)
{
a[i][0]='*';
a[i][m+1]='*';
}
for(j=0;j<=m+1;j++)
{
a[0][j]='*';
a[n+1][j]='*';
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(a[i][j]!='*')
{
cod1=m*(i-1)+j;
// Fac "matricea de adiacenta"
if(a[i+1][j]!='*'){cod2=m*i+j; v[cod1].push_back(cod2); v[cod2].push_back(cod1);}
if(a[i-1][j]!='*'){cod2=m*(i-2)+j; v[cod1].push_back(cod2); v[cod2].push_back(cod1);}
if(a[i][j+1]!='*'){cod2=m*(i-1)+(j+1); v[cod1].push_back(cod2); v[cod2].push_back(cod1);}
if(a[i][j-1]!='*'){cod2=m*(i-1)+(j-1); v[cod1].push_back(cod2); v[cod2].push_back(cod1);}
// Pun in coada dragonii
if(a[i][j]=='D'){cod2=m*(i-1)+j; q.push(cod2); lungime[cod2]=0;}
// Verific inceputul si sfarsitul
if(a[i][j]=='I') {inceput1=i;inceput2=j;}
else if(a[i][j]=='O') {final1=i;final2=j;}
}
}
}
// Drumuri minime de la dragoni
while(!q.empty())
{
nod=q.front();
for(i=0;i<v[nod].size();i++)
{
vecin=v[nod][i];
if(lungime[vecin]==-1)
{
lungime[vecin]=lungime[nod]+1;
q.push(vecin);
}
}
q.pop();
}
cod_inceput=m*(inceput1-1)+inceput2;
cod_final=m*(final1-1)+final2;
for(i=1;i<=n*m;i++)viz[i]=0;
p=0;u=n*m;
while(p<=u)
{
mij=(p+u)/2;
for(i=1;i<=n*m;i++)viz[i]=0;
if(DFS(cod_inceput,mij)==1){copie=mij;p=mij+1;}
else u=mij-1;
}
g<<copie;
return 0;
}