Pagini recente » Cod sursa (job #737794) | Cod sursa (job #1920810) | Cod sursa (job #622490) | Cod sursa (job #980660) | Cod sursa (job #2104346)
#include<bits/stdc++.h>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int n,m,i1,i2,j_1,j2; //math.h foloseste un j1 in define asa ca am denumit variabila j_1
int a[1003][1003];
int a1[1003][1003];
int dx[]={0,0,-1,1};
int dy[]={1,-1,0,0};
queue<int> c1,c2;
void bordare()
{
int i,j;
for(i=0; i<=n+1; i++)
{a[i][0]=-1; a[i][m+1]=-1; a1[i][0]=-1; a1[i][m+1]=-1;}
for(j=1; j<=m+1; j++)
{a[0][j]=-1; a[n+1][j]=-1; a1[0][j]=-1; a1[m+1][j]=-1;}
}
void citire()
{
char c;
int i,j;
f>>n>>m;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
{
f>>c;
if(c=='*')
a[i][j]=-1;//perete
if(c=='D')//dragon
{a[i][j]=1; c1.push(i); c2.push(j);}
if(c=='I')
{i1=i; j_1=j;}
if(c=='O')
{i2=i; j2=j;}
}
}
void lee()
{
int ii,jj,i,j,k,pas;
while(!c1.empty())
{
i=c1.front(); j=c2.front();
c1.pop(); c2.pop();
pas=a[i][j];
for(k=0; k<4; k++)
{
ii=i+dx[k]; jj=j+dy[k];
if(a[ii][jj]==0)
{
c1.push(ii); c2.push(jj);
a[ii][jj]=pas+1;
}
}
}
}
int main()
{
int i,ii,jj,k,j,ok=0,sol=0;
citire();
bordare();
lee();
int st=1, dr=max(m,n), mij;
while(st<=dr)
{
mij=st+(dr-st)/2;
if(mij>a[i1][j_1])
{
dr=mij-1; continue;
}
else
{
ok=0;
while(!c1.empty()) {c1.pop(); c2.pop();}
a1[i1][j_1]=mij;
c1.push(i1); c2.push(j_1);
while(!c1.empty() && ok==0)
{
i=c1.front(); j=c2.front();
c1.pop(); c2.pop();
for(k=0; k<4; k++)
{
ii=i+dx[k]; jj=j+dy[k];
if(a1[ii][jj]!=-1)
if(mij<=a[ii][jj] && a1[ii][jj]!=mij)
{
c1.push(ii); c2.push(jj);
a1[ii][jj]=mij;
if(ii==i2 && jj==j2)
{ok=1;}
}
}
}
}
if(ok)
{st=mij+1; sol=1;}
else
dr=mij-1;
}
if(sol) g<<dr-1;
else g<<-1;
return 0;
}