Pagini recente » Cod sursa (job #2765202) | Cod sursa (job #608800) | Cod sursa (job #3178352) | Cod sursa (job #1575013) | Cod sursa (job #2083033)
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
struct punct
{
int Linie,Coloana,Distanta;
} PunctStart,PunctSfarsit;
char c;
int mat[1005][1005],dx[]= {-1,0,1,0},dy[]= {0,1,0,-1},m,n;
queue<punct> Coada;
ifstream f("barbar.in");
ofstream g("barbar.out");
void CompleteazaMatrice(int L,int C,int Val)
{
if(c=='D')
{
mat[L][C]=0;
punct aux;
aux.Linie=L;
aux.Coloana=C;
aux.Distanta=0;
Coada.push(aux);
return ;
}
if(c=='*')
{
mat[L][C]=-1;
return ;
}
mat[L][C]=-2;
if(c=='.') return ;
if(c=='I')
{
PunctStart.Linie=L;
PunctStart.Coloana=C;
return ;
}
PunctSfarsit.Linie=L;
PunctSfarsit.Coloana=C;
}
int Drum(int valoare)
{
while(!Coada.empty()) Coada.pop();
bool viz[1005][1005];
for(int i=1;i<=m;++i)
for(int j=1;j<=m;++j)
viz[i][j]=0;
punct aux=PunctStart;
aux.Distanta=0;
Coada.push(aux);
viz[aux.Linie][aux.Coloana]=1;
while(!Coada.empty())
{
int linie=Coada.front().Linie;
int coloana=Coada.front().Coloana;
int distanta=Coada.front().Distanta;
int i;
for(i=0; i<4; ++i)
{
punct aux;
aux.Linie=linie+dx[i];
aux.Coloana=coloana+dy[i];
if(!viz[aux.Linie][aux.Coloana] && mat[aux.Linie][aux.Coloana]>=valoare)
{
viz[aux.Linie][aux.Coloana]=1;
if(PunctSfarsit.Linie==aux.Linie && PunctSfarsit.Coloana==aux.Coloana) goto endwhile;
aux.Distanta=distanta+1;
Coada.push(aux);
}
}
Coada.pop();
}
endwhile:
if(Coada.empty()) return 0;
return 1;
}
int CautareBinara(int st,int dr)
{
int LastApp=-1;
while(st<=dr)
{
int mij=(dr-st)/2+st;
if(Drum(mij)==1)
{
LastApp=mij;
st=mij+1;
continue;
}
dr=mij-1;
}
return LastApp;
}
int main()
{
f>>m>>n;
for(int i=1; i<=m; ++i)
for(int j=1; j<=n; ++j)
{
f>>c;
CompleteazaMatrice(i,j,c);
}
while(!Coada.empty())
{
int linie=Coada.front().Linie;
int coloana=Coada.front().Coloana;
int i;
for(i=0; i<4; ++i)
if(mat[linie+dx[i]][coloana+dy[i]]==-2)
{
punct aux;
aux.Linie=linie+dx[i];
aux.Coloana=coloana+dy[i];
aux.Distanta=Coada.front().Distanta+1;
Coada.push(aux);
mat[aux.Linie][aux.Coloana]=aux.Distanta;
}
Coada.pop();
}
g<<CautareBinara(1,mat[PunctStart.Linie][PunctStart.Coloana])<<'\n';
return 0;
}