Pagini recente » Cod sursa (job #2041374) | Cod sursa (job #3164944) | Cod sursa (job #534285) | Cod sursa (job #1612927) | Cod sursa (job #847849)
Cod sursa(job #847849)
#include <fstream>
using namespace std;
short int dx[4]={1,-1,0,0};
short int dy[4]={0,0,1,-1};
bool trecut[1002][1002];
int m[1002][1002];
struct
{
unsigned short int linie;
unsigned short int coloana;
int pericol;
}v[2000000]; //de calculat cat de mare trebuie
unsigned short int r,c,i,j,k;
unsigned int cap,coada,lin_intru,col_intru,lin_ies,col_ies;
bool posibil(int nr)
{
v[1].linie=lin_intru;
v[1].coloana=col_intru;
cap=1;
coada=2;
while(cap<coada)
{
//
//trecut[v[cap].linie][v[cap].coloana]=1; //daca fac asa bag noduri de mai multe ori in coada
/*for(i=0;i<=c+1;i++)
{
for(j=0;j<=r+1;j++)
fout<<trecut[i][j];
fout<<endl;
}*/
//fout<<"lin="<<v[cap].linie<<" col="<<v[cap].coloana<<endl;
if(v[cap].linie==lin_ies && v[cap].coloana==col_ies)
{//si cand merge se initializeaza
for(k=0;k<=coada+1;k++)
{
v[k].linie=0;
v[k].coloana=0;
v[k].pericol=0;
}
for(i=0;i<=c;i++)
for(j=0;j<=r;j++)
trecut[i][j]=0;
return 1;
}
for(k=0;k<4;k++)
{
if(m[v[cap].linie+dy[k]][v[cap].coloana+dx[k]]>=nr && trecut[v[cap].linie+dy[k]][v[cap].coloana+dx[k]]==0 && v[cap].linie+dy[k]<=r && v[cap].coloana+dx[k]<=c && v[cap].linie+dy[k]>0 && v[cap].coloana+dx[k]>0)
{
trecut[v[cap].linie+dy[k]][v[cap].coloana+dx[k]]=1;
v[coada].linie=v[cap].linie+dy[k];
v[coada].coloana=v[cap].coloana+dx[k];
coada++;
}
}
cap++;
}
for(k=0;k<=coada+1;k++)
{
v[k].linie=0;
v[k].coloana=0;
v[k].pericol=0;
}
for(i=0;i<=c;i++)
for(j=0;j<=r;j++) //nu se initializeaza bine
trecut[i][j]=0;
return 0;
}
int main()
{
char x;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
fin>>r>>c;
for(i=1;i<=r;i++)
{
for(j=1;j<=c;j++)
{
fin>>x;
if(x=='I')
{
m[i][j]=2002001;
lin_intru=i;
col_intru=j;
}
if(x=='O')
{
m[i][j]=2002001;
lin_ies=i;
col_ies=j;
}
if(x=='*')m[i][j]=-1;
if(x=='D')m[i][j]=0;
if(x=='.')m[i][j]=2002001;
}
}
/*
for(i=1;i<=r;i++)
{
for(j=1;j<=c;j++)
{
fout<<m[i][j]<<' ';
}
fout<<endl;
}
*/
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
if(m[i][j]==0)
{
v[1].linie=i;
v[1].coloana=j;
v[1].pericol=0;
cap=1;
coada=2;
while(cap<coada) //sa scot o conditie
{
for(k=0;k<4;k++)
{
if(m[v[cap].linie+dy[k]][v[cap].coloana+dx[k]]!=-1 && v[cap].pericol+1<m[v[cap].linie+dy[k]][v[cap].coloana+dx[k]] && v[cap].linie+dy[k]<=r && v[cap].coloana+dx[k]<=c && v[cap].linie+dy[k]>0 && v[cap].coloana+dx[k]>0)
{
m[v[cap].linie+dy[k]][v[cap].coloana+dx[k]]=v[cap].pericol+1;
v[coada].linie=v[cap].linie+dy[k];
v[coada].coloana=v[cap].coloana+dx[k];
v[coada].pericol=v[cap].pericol+1;
coada++;
}
}
cap++;
}
for(k=1;k<=coada+1;k++)
{
v[k].linie=0;
v[k].coloana=0;
v[k].pericol=0;
}
}
//fout<<endl<<endl;
/*for(i=1;i<=r;i++)
{
for(j=1;j<=c;j++)
{
fout<<m[i][j]<<' ';
}
fout<<endl;
}
fout<<endl;*/
long int cautat=-1;
long int sus;
if(m[lin_intru][col_intru]>m[lin_ies][col_ies])
sus=m[lin_ies][col_ies];
else
sus=m[lin_intru][col_intru];
long int jos=-1;
long int mijl=(sus+jos)/2;
//fout<<"sus: "<<sus<<" jos: "<<jos<<" mijl: "<<mijl<<endl;
while(jos<=sus)
{
//fout<<"sus: "<<sus<<" jos: "<<jos<<" mijl: "<<mijl<<endl;
if(posibil(mijl)==1)
{
cautat=mijl;
jos=mijl+1;
}
else
{
sus=mijl-1;
}
mijl=(sus+jos)/2;
//if(sus==jos)break;
}
fout<<cautat<<endl;
//fout<<posibil(3);
//sterg asta si scriu finalul caci functia merge si sa fiu atent la cazul de iesire fara initializare !
fin.close();
fout.close();
return 0;
}